首页 > 解决方案 > 为什么 /var/run/docker.sock 的所有者和组在主机和容器之间有所不同?

问题描述

我正在做 docker-outside-of-docker,所以我/var/run/docker.sock通过 bind-mount 将主机安装到容器中。

现在容器中的用户和组与主机上的不同,尽管它们应该是相同的。

Container:
ls -lna /var/run/docker.sock
srwxr-xr-x 1 0 0 0 Sep  2 21:30 /var/run/docker.sock
             ^- owner
               ^-group
Host:
lrwxr-xr-x  1 0  1  74  2 Sep 23:30 /var/run/docker.sock -> /Users/(...)/docker.sock
              ^- owner
                 ^-group

由于容器以非 root 用户运行,并且我无法使组对齐,因此在尝试执行 docker 命令时会导致权限被拒绝错误。

标签: dockerdocker-compose

解决方案


$ docker --version
Docker version 20.10.5, build 55c4c88

解决方案

通过入口点脚本,我设置了容器启动所需的权限。

chown root:docker /var/run/docker.sock
chmod g+w /var/run/docker.sock

它要求容器以 root 身份启动,并且仅在将权限更改为 jenkins 用户之后。

此解决方案独立于 Docker Desktop/Docker for Mac 的 gRPC FUSE 设置工作。

死胡同

我放弃了使用绑定安装解决权限问题。因为:

原来,我忽略了主机/var/run/docker.sock是一个符号链接。我想,由于那个符号链接,权限没有按预期转移。但我找不到有关它的文档,只有提示

直接绑定安装链接目标时,运行 docker 命令时,我得到

Error response from daemon: Mounts denied: approving /Users/(...)/docker.sock: file does not exist

大概是因为该文件是一个套接字链接(参见ls长格式” )。

事实证明,这似乎是由我的 Docker 桌面的 gRPC FUSE 文件共享设置引起的。禁用它会使错误消失,并且套接字链接docker.sock会自动安装为容器用户作为所有者和组。

但是,在容器内执行 egdocker image ls现在会导致无法解释的错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

推荐阅读