问题描述
希望在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中实现容器用户和主机用户对同一卷中文件的访问,你可以考虑以下几个步骤:
-
不使用
--userns-remap
标志:
在你的情况下,出现访问权限问题的原因是你同时使用了--userns-remap
标志和--user
标志。--userns-remap
用于设置用户命名空间的映射,而--user
用于在容器内部以指定的用户身份运行进程。这两者可能会相互冲突。尝试去掉--userns-remap
标志,只使用--user
标志来运行容器。 -
以主机用户身份运行容器:
你可以尝试在容器中使用与主机用户相同的用户标识运行。这将使容器中的用户具有与主机用户相同的权限,从而避免权限问题。以下是如何在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
目录作为卷。 -
设置文件权限:
在容器内部运行NPM安装命令时,可能需要对某些目录或文件进行写入操作。你可以在主机系统上为这些目录和文件设置适当的权限,以便容器内的用户可以访问和修改。例如,你可以在主机上运行以下命令来为~/workspace/app
目录设置权限:
bash
chmod -R 777 ~/workspace/app
请注意,为了安全考虑,最好只将权限设置为必要的最小值。
通过执行上述步骤,你可以在Docker容器内实现容器用户和主机用户对同一卷中文件的访问,并避免访问权限问题。
请注意,由于Docker版本和操作系统差异,某些命令和操作可能会有所不同。在执行任何更改之前,建议你先阅读相关的文档并在安全环境中进行测试。