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

时间:2017-07-21 11:06:31

标签: docker permissions

背景:

这个来自容器失败行为的docker cp有点古怪 - 时髦,所以我认为应该记录下来。我找不到匹配的问题或码头问题,但我可以看到喋喋不休/评论,我认为这表明人们正在遇到这个问题。

我有一个docker图像,在图像创建时我会在图像中打包一些目录。当容器第一次启动时,目录将从容器中复制出来并用于初始化目录,然后将该目录作为容器的docker卷安装。

问题:

我看到的是,根据图像的构建方式,有时目录中的docker cp会因为“打开< dir> /< file>权限被拒绝”而失败目录的副本。

我看到当图像由开发人员本地构建时,它工作正常。我看到当图像是从已发布的模块构建时失败的。

以root身份从目录中执行docker cp工作正常。

在常规用户无效的情况下,将docker cp从目录中删除。该目录已创建但为空。

目录权限(奇怪的是源目录)被证明是问题的原因

这有点明显但也不明显;可以创建顶级目录,这样无论SOURCE目录的权限是什么,您都希望完整目录层次结构中的递归副本能够正常工作。

在源控制目录中,所有权具有写入权限集。发布模块时,删除了写入权限。所以解决方案是在使用已发布的模块构建时,必须添加写入权限。

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月的容器中看到这个码头17.03.1 centos cp。

2 个答案:

答案 0 :(得分:1)

<强>答案:

因为有点奇怪,目录的权限不可写。这会影响在&#39; docker cp&#39;。

期间将文件写入该目录

<强>解释

docker cp创建没有写权限集的目录。然后无法将文件写入其中。

如果你以root用户身份将cp输出目录,则可以递归地复制该目录。如果您将目录作为非root用户停靠在目录中,并且未在包含某些内容的层次结构中的目录上设置写权限,则 docker cp命令将复制目录和文件,直到它创建不可写目录,然后无法使用&#34; open;将下一个文件复制到该不可写目录中;许可被拒绝&#34;

<强>解决方案:

在Docker镜像中创建目录时,在Dockerfile或docker构建时,使用docker cp(不是root用户)将其复制出容器,然后确保在每个目录上设置了顶级可写权限。例如&#39; find -type d -exec chmod + w {} +&#39;。

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

答案 1 :(得分:0)

如上所述,目录权限是要检查的第一件事。尤其是,如果要访问的文件夹设置了正确的权限是远远不够的-它的父文件夹(到您的主目录)至少需要具有列表目录权限。另请参阅我的答案here

但是,什么解决了

的问题
  

cp:无法打开'/directory/./file':权限被拒绝

在我的情况下,

Windows EFS(加密文件系统)。确保源文件中没有文件或文件夹是基于文件系统加密的。 Docker尝试从Linux访问文件系统,并且与Windows不同,Docker不会在读取时透明地解密文件。

可以通过右键单击文件/文件夹,然后选择属性> 常规选项卡> 高级按钮> 加密来切换加密内容以保护数据