首页 > 解决方案 > Docker 以 root 身份挂载卷

问题描述

为什么 Docker 将卷挂载为root,而不是作为具有运行命令的用户docker run?这可以通过设置一些参数/参数等来改变吗?

MWE:

$ ls -la
drwxr-xr-x 2 ubuntu   ubuntu   4096 Aug 22 18:09 shinylog

$ docker run -v $(pwd)/test_dir/:/home/ --name nginx -d nginx
bf340face11485a81ee7c208d490f11abbdc84089ffe9c01d71ffcf8b9ffc27d

$ ls -la
drwxr-xr-x 2 ubuntu   ubuntu   4096 Aug 22 18:09 shinylog
drwxr-xr-x 2 root     root   4096 Aug 22 18:33 test_dir

$ echo $USER
ubuntu

编辑:安装docker后我遇到了错误:

Got permission denied while trying to connect to the Docker 
daemon socket at unix:///var/run/docker.sock: Get 
http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial 
unix /var/run/docker.sock: connect: permission denied

并执行:

sudo usermod -a -G docker $USER

也许这就是问题所在?

标签: dockerpermissionsdocker-volume

解决方案


docker命令是dockerd守护程序其余 API 的接口。该守护进程负责配置卷并执行任务以运行容器。在今天的大多数安装中,这个守护进程都以 root 身份运行。

对于主机卷,它们是具有额外功能的 Linux 绑定挂载。通常使用绑定挂载,源目录必须已经存在。但是为了提高可用性,如果这个目录不存在,docker 会为你创建这个目录。它从守护进程执行此操作,该守护进程以 root 身份运行。

虽然将该文件夹配置为您的当前用户可能很有用,但存在一些挑战。首先,守护进程不一定知道 uid/gid,它不是其余 API 的一部分。此外,守护程序不一定在您的本地主机上运行,​​它可能是对远程主机的 API 调用。并且您主机上的用户不一定与容器中的用户匹配。

理想的解决方案是提前创建具有所需权限和所有权的目录。或者你可以切换到命名卷,它有一个方便的功能,docker 将复制该位置的图像内容以初始化卷,包括所有权和权限(当卷为空并且正在创建容器时会发生这种情况,所以当您有新图像时,它不会收到更新)。最后一个选项是以 root 身份启动容器,但使用入口点脚本修复权限,然后使用 gosu 之类的命令更改为非 root 用户来运行应用程序。


推荐阅读