docker - 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
也许这就是问题所在?
解决方案
该docker
命令是dockerd
守护程序其余 API 的接口。该守护进程负责配置卷并执行任务以运行容器。在今天的大多数安装中,这个守护进程都以 root 身份运行。
对于主机卷,它们是具有额外功能的 Linux 绑定挂载。通常使用绑定挂载,源目录必须已经存在。但是为了提高可用性,如果这个目录不存在,docker 会为你创建这个目录。它从守护进程执行此操作,该守护进程以 root 身份运行。
虽然将该文件夹配置为您的当前用户可能很有用,但存在一些挑战。首先,守护进程不一定知道 uid/gid,它不是其余 API 的一部分。此外,守护程序不一定在您的本地主机上运行,它可能是对远程主机的 API 调用。并且您主机上的用户不一定与容器中的用户匹配。
理想的解决方案是提前创建具有所需权限和所有权的目录。或者你可以切换到命名卷,它有一个方便的功能,docker 将复制该位置的图像内容以初始化卷,包括所有权和权限(当卷为空并且正在创建容器时会发生这种情况,所以当您有新图像时,它不会收到更新)。最后一个选项是以 root 身份启动容器,但使用入口点脚本修复权限,然后使用 gosu 之类的命令更改为非 root 用户来运行应用程序。
推荐阅读
- flutter - firebase auth with flutter
- docker - Secure private docker-registry
- c# - 我希望能够使用基于用户角色的授权,但这是我的问题:
- c - 递归函数中缺少返回语句,仍然有效
- django - django restframework: blank=False and default='x' 创建一个带有 required=False 字段的模型序列化器。如何规避?
- javascript - 如何在angular js中使用ng-model将文本框值发送到控制器
- asp.net-core - 客户端和用户使用 Identity Server 访问受保护的 API
- python - 如何在 Kivy 中更改 TabbedPanelItem 的背景颜色
- excel - 对于 VBA 中的每个 - 从第三个样式表开始
- php - Openssl 解密 (DES) 在 PHP 中返回 false