为什么在容器外的目录层次结构的docker cp失败并且权限被拒绝?

背景:

这个docker从容器的失败行为是有点古怪 – 时髦,所以我认为它应该logging。 我找不到一个匹配的问题或docker问题,但我可以看到我认为表示人们遇到这个问题的闲谈/评论。

我有一个docker图像,并在图像创build时,我收拾了图像中的一些目录。 第一次启动容器时,将目录从容器中复制出来,然后用来初始化一个目录,然后将其作为容器的docker卷进行安装。

问题:

我看到的是,取决于如何build立图像,有时候,目录中的docker cp会在做目录的部分拷贝之后失败,并且“open <dir> / <file>权限被拒绝”

我看到,当一个开发人员在本地创build图像时,它工作正常。 我看到,当从发布的模块构build的图像失败时。

做一个docker cp作为根目录工作正常。

作为普通用户做一个泊坞窗CP目录不工作。 该目录已创build,但是是空的。

目录权限(奇怪的源目录)竟然是问题的原因

这有点明显,但也不明显; 最好的目录可以创build好,所以你会希望完整的目录层次结构的recursion拷贝能够工作,不pipeSOURCE目录的权限是什么。

在源代码控制目录中,拥有写权限集。 当模块被释放时,写入权限被删除。 所以解决scheme是在使用已发布的模块构build时,必须重新添加写入权限。

drwxr-xr-x dev/dev buildarea/.../jenkins/ drwxr-xr-x dev/dev buildarea/.../jenkins/email-templates/ dr-xr-xr-x root/root /releasearea/.../jenkins/ dr-xr-xr-x root/root /releasearea/.../jenkins/email-templates/ 

我从2017年7月的集装箱docker看到这个17.03.1 centos cp。

回答:

因为有点奇怪, 目录的权限是不可写的。 这会影响在'docker cp'期间将文件写入该目录。

说明:

docker工人创build目录没有写权限设置。 然后无法写入文件。

如果你将docker cp作为根目录存放在一个目录下,那么这个目录就会被recursion地复制出来。 如果将docker cp作为非root用户卸载目录,并且在包含某些内容的层次结构中没有设置写权限,则docker cp命令将复制目录和文件,直到它创build不可写目录,然后无法复制下一个文件放到那个不可写入的目录中,打开“权限被拒绝”

解:

在Dockerfile或docker build时,在Docker镜像中创build目录时,将使用docker cp(作为非root用户)复制出容器,然后确保在每个目录上设置最高级别的可写入权限。 例如'find -type d -exec chmod + w {} +'。

https://github.com/moby/moby/issues/3986#issuecomment-316966200