在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
很奇怪,我有一个类似的Dockerfile如你,但我有这个额外的指令'VOLUME/data',当我在执行'docker run'的时候,所有的东西都回到'root'的所有权上(注意另一个区别是我的卷在开始时是空的,所以我只更改卷文件夹所有权 – Huygens
我在这里说'我听到了公牛的声音'!我忽略了有关'Dockerfile'的文档,它声明'从Dockerfile中更改卷:如果任何构建步骤在卷之后更改卷中的数据宣布,那些cha年纪将被丢弃。“我刚刚拿到了! VOLUME指令是在我创建文件夹并设置权限之前。它被简单地丢弃了。 – Huygens
@惠更斯我有一个个人最佳实践,不要将卷与Dockerfile混合。看到我的博客文章的完整解释,但你已经遇到了一个重大问题已经:https://boxboat.com/2017/01/23/volumes-and-dockerfiles-dont-mix/ – BMitch