在 Docker 中将“命名卷”挂载为非 root

Posted

技术标签:

【中文标题】在 Docker 中将“命名卷”挂载为非 root【英文标题】:Mount "named volume" as non-root in Docker 【发布时间】:2017-01-26 15:39:59 【问题描述】:

有没有办法以非 root 用户身份挂载命名卷?我试图避免必须在每个 Dockerfile 中运行 chown,但我需要挂载可由非 root 用户写入,以便能够在映像中写入由构建创建的工件

这就是我正在尝试的

docker run --rm -it -v /home/bob/dev/:/src/dev -v builds:/mnt/build --name build hilikus/build /bin/bash

但是对于第二个坐骑,我得到了

[user@42f237282128 ~]$ ll /mnt
total 4
drwxr-xr-x 2 root root 4096 Sep 18 19:29 build

我的另一个挂载 (/src/dev/) 由 user 拥有,而不是由 root 拥有,因此它可以满足我的需求;但是,我无法对命名卷执行相同的操作。

【问题讨论】:

【参考方案1】:

命名卷在该位置初始化为您的映像内容,因此您需要在 Dockerfile 中设置权限:

$ cat df.vf-uid
FROM busybox
RUN mkdir -p /data && echo "hello world" > /data/hello && chown -R 1000 /data

$ docker build -t test-vf -f df.vf-uid .
Sending build context to Docker daemon 23.06 MB
Step 1 : FROM busybox
 ---> 2b8fd9751c4c
Step 2 : RUN mkdir -p /data && echo "hello world" > /data/hello && chown -R 1000 /data
 ---> Using cache
 ---> 41390b132940
Successfully built 41390b132940

$ docker run -v test-vol:/data --rm -it test-vf ls -alR /data
/data:
total 12
drwxr-xr-x    2 1000     root          4096 Sep 19 15:26 .
drwxr-xr-x   19 root     root          4096 Sep 19 15:26 ..
-rw-r--r--    1 1000     root            12 Aug 22 11:43 hello

【讨论】:

很奇怪,我有一个和你类似的 Dockerfile,但是我有这个额外的指令VOLUME /data,当我按照你显示的那样执行docker run 时,一切都回到了root 所有权(请注意,另一个区别是我的卷在开始时是空的,所以我只更改卷文件夹的所有权。 正如我们在这里所说的,我“抓住了牛角”!我忽略了Dockerfile 上的文档,上面写着Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded. 我刚刚拥有它! VOLUME 指令是在我创建文件夹并设置权限之前。它被简单地丢弃了。 @Huygens 我个人的最佳实践是不要将卷与 Dockerfile 混合。请参阅我的博客文章以获得完整的解释,但您已经遇到了一个大问题:boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix 在 Dockerfile 中声明它们的附加价值主要是两件事:即使您忘记在 docker run 中提供卷,它也会保留数据(并且知道命名卷是自动创建的) ;包装器可以通过简单地检查图像来自动建议用户创建卷(不需要文档)。但是,如果您提供好的文档,那么这两点就不那么相关了,可以认为是可选的。这一切都是为了告诉你,是的,我同意你的最佳做法,它带来了更多的优势(或更少的麻烦)。 @Darioseidl 以先启动者为准,一旦卷初始化,将不会通过更新映像或使用具有不同映像的卷再次初始化。【参考方案2】:

如果您使用新的--mount 语法而不是旧的-v/--volume 语法,则可以通过docker volume create somename --opt -o=uid=1000 或类似的方式将uid 分配给卷的内容。

见https://docs.docker.com/engine/reference/commandline/volume_create/#driver-specific-options

我还没有完全测试它以非 root 身份运行或使用带有 userns-map 选项的 dockremap 动态用户,但希望很快。

【讨论】:

以上是关于在 Docker 中将“命名卷”挂载为非 root的主要内容,如果未能解决你的问题,请参考以下文章

NFS/hostPath 在 kubernetes 中挂载为非 root

我们可以在现有集群中将 ambari 配置为非 root 用户吗

linux 自动挂载 ,挂载的文件夹属主是root,怎样使挂载后目录的属主为非root用户?

将 Docker 映像中的用户切换为非 root 用户

如何在 docker compose 中将主机目录挂载为卷

如何在主机上为 docker-compose.yml 中的命名卷设置路径