在Docker中以非root用户身份挂载“named volume”

问题描述:

是否有任何方法将非命名卷挂载为非root用户?我试图避免必须在每个Dockerfile中运行chown,但我需要非root用户可以写入mount以便能够写入由映像中的内部版本创建的工件在Docker中以非root用户身份挂载“named volume”

这是我'米试图

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

但对于第二座架,我得到

[[email protected] ~]$ ll /mnt 
total 4 
drwxr-xr-x 2 root root 4096 Sep 18 19:29 build 

我的其他安装(/src/dev/)由用户拥有,而不是由root所以它给我所需要的;但是,我无法对指定的卷执行相同的操作。

命名的音量初始化为你的形象在该位置的内容,所以你需要设置你的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 
+0

很奇怪,我有一个类似的Dockerfile如你,但我有这个额外的指令'VOLUME/data',当我在执行'docker run'的时候,所有的东西都回到'root'的所有权上(注意另一个区别是我的卷在开始时是空的,所以我只更改卷文件夹所有权 – Huygens

+0

我在这里说'我听到了公牛的声音'!我忽略了有关'Dockerfile'的文档,它声明'从Dockerfile中更改卷:如果任何构建步骤在卷之后更改卷中的数据宣布,那些cha年纪将被丢弃。“我刚刚拿到了! VOLUME指令是在我创建文件夹并设置权限之前。它被简单地丢弃了。 – Huygens

+1

@惠更斯我有一个个人最佳实践,不要将卷与Dockerfile混合。看到我的博客文章的完整解释,但你已经遇到了一个重大问题已经:https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/ – BMitch