在 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 用户吗