docker - 为什么 /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 命令时会导致权限被拒绝错误。
解决方案
$ 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?
推荐阅读
- string - 从 UART 字符构建字符串 - 家庭学习 C
- node.js - MongoDB & Node.js - 如何用 $eq 和 $cond 对字段求和,其中表达式是对象数组
- excel - 使用 VBA 更新 Excel 数据透视表数据源后,错误:数据透视表报告已保存而没有基础数据
- logic - 由于逻辑问题 SPSS,我如何管理丢失的数据?
- graphql - Graphene-Django 创建多个实例
- java - 什么不可变对象适用于 List.contains?
- bash - 将多个变量输出转换为bash中的表
- swift - 当 Swift 中的计时器功能触发 AVAudioPlayer 声音时出现致命错误
- python - if 语句不起作用,它会自动使用 else 语句
- assembly - 为什么 CALL 后 BX 会被销毁?