在Docker中实现容器用户和主机用户对同一卷中文件的访问

44次阅读
没有评论

问题描述

希望在Docker容器内部和主机用户之间共享卷中的文件,使得两者都能够随意读取和写入这些文件。用户正在尝试使用Docker的命名空间功能来实现这一目标,但是在执行过程中遇到了问题。主机用户名为aryzing,用户正在使用以下方式运行Docker守护进程:

dockerd --userns-remap=aryzing

用户将主机的~/workspace/app目录映射到容器的/usr/src/app目录作为卷。在主机系统中,用户可以自由地修改这些文件,但是在容器内部,却遇到了访问权限错误。具体来说,用户在容器内部运行NPM的安装命令npm install时,遇到了权限错误,无法安装软件包,错误信息如下:

Error: EACCES: permission denied, access '/usr/src/app/node_modules'

根据这个帖子,用户还尝试了使用--user标志来运行容器,但是仍然遇到了相同的问题。用户希望得到一些建议,以实现他所期望的功能。

解决方案

以下操作步骤可能涉及到Docker版本差异,确保在执行之前进行适当的版本检查。

要在Docker中实现容器用户和主机用户对同一卷中文件的访问,你可以考虑以下几个步骤:

  1. 不使用--userns-remap标志
    在你的情况下,出现访问权限问题的原因是你同时使用了--userns-remap标志和--user标志。--userns-remap用于设置用户命名空间的映射,而--user用于在容器内部以指定的用户身份运行进程。这两者可能会相互冲突。尝试去掉--userns-remap标志,只使用--user标志来运行容器。

  2. 以主机用户身份运行容器
    你可以尝试在容器中使用与主机用户相同的用户标识运行。这将使容器中的用户具有与主机用户相同的权限,从而避免权限问题。以下是如何在docker run命令中以主机用户身份运行容器的示例:
    bash
    docker run -d --user $(id -u):$(id -g) -v ~/workspace/app:/usr/src/app your_image_name

    这将使用$(id -u):$(id -g)来指定与主机用户相同的UID和GID,并将主机的~/workspace/app目录映射到容器的/usr/src/app目录作为卷。

  3. 设置文件权限
    在容器内部运行NPM安装命令时,可能需要对某些目录或文件进行写入操作。你可以在主机系统上为这些目录和文件设置适当的权限,以便容器内的用户可以访问和修改。例如,你可以在主机上运行以下命令来为~/workspace/app目录设置权限:
    bash
    chmod -R 777 ~/workspace/app

    请注意,为了安全考虑,最好只将权限设置为必要的最小值。

通过执行上述步骤,你可以在Docker容器内实现容器用户和主机用户对同一卷中文件的访问,并避免访问权限问题。

请注意,由于Docker版本和操作系统差异,某些命令和操作可能会有所不同。在执行任何更改之前,建议你先阅读相关的文档并在安全环境中进行测试。

正文完