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



背景:

这个从容器失败行为中输出的 docker cp 有点古怪时髦,所以我认为它应该被记录下来。我找不到匹配的问题或 docker 问题,但我可以看到喋喋不休/评论,我认为这表明人们遇到了这个问题。

我有一个 docker 映像,在映像创建时,我在映像中打包了一些目录。当容器首次启动时,目录将从容器中复制出来,并用于初始化目录,然后挂载为容器的 docker 卷。

问题:

我所看到的是,根据映像的构建方式,有时目录外的 docker cp 会在执行目录的部分复制后失败并显示"打开

/权限被拒绝"。

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

以根身份在目录中执行 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/

我在容器 17.03.1 年的 docker 2017 年 7 月看到了这一点。

答案:

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

解释:

Docker CP 创建未设置写入权限的目录。然后无法将文件写入其中。

如果你 docker cp 以 root 身份输出一个目录,那么该目录将被递归复制出来。如果您以非 root 用户的身份 docker cp 输出目录,并且未对层次结构中包含某些内容的目录设置写入权限,则docker cp 命令将复制目录和文件,直到它创建不可写目录,然后无法将下一个文件复制到该不可写目录中,并带有"打开;许可被拒绝"。

溶液:

在 Dockerfile 或 docker 构建时,当在 docker 镜像中创建将使用 docker cp(作为非 root 用户(从容器中复制出来的目录时,请确保在每个目录上设置顶级可写权限。 例如,'find -type d -exec chmod +w {} +'。

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

如前所述,目录权限是首先要检查的内容。特别是,如果被访问的文件夹设置了正确的权限是不够的 - 其父文件夹(直到您的主目录(至少需要具有列表目录权限。另请参阅我的答案 这里.

然而,是什么解决了

cp:无法打开"/目录/./文件":权限被拒绝

在我的情况下是Windows EFS(加密文件系统(。确保源中的任何文件或文件夹均未基于文件系统进行加密。Docker尝试从Linux访问文件系统,并且与Windows不同,在读取时不会透明地解密文件。

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

解决此问题的一种黑客方法是提升本地计算机上的文件权限,然后将其复制到容器中。

chmod 777 source_file.txt # <-- this is unsafe (change to a better set of permissions)
docker cp source_file.txt <container>:/path/to/file.txt

您的容器现在可以以根用户或非根用户身份运行该文件。

相关内容

最新更新