使用 Travis 时已安装的 Docker 卷具有不同的所有权

Mounted Docker volume has different ownership when using Travis

此问题涉及 this repository with the most relevant Travis job here

存储库用于从 Jupyter 笔记本构建的静态站点。笔记本使用 build/build.py 进行转换,对于每个 post,构建一个 Docker 图像,启动一个相应的容器并安装 post 笔记本目录,并使用 nbconvert 将笔记本转换为 Markdown。 nbconvert 转换的一个步骤涉及创建支持文件目录。由于权限问题,这在 Travis 上失败了。

在尝试调试此问题时,我发现在 运行 [之前,我的本地计算机和 Travis(我的用户名已切换为 travis)上的 repo 的所有权和权限是相同的 Docker。尽管如此,在 Docker 容器的挂载卷中,所有权是不同的:

本地:

drwxrwxr-x 3 jovyan  1000   4096 Dec 10 19:56 .
drwsrwsr-x 1 jovyan users   4096 Dec  3 21:51 ..
-rw-rw-r-- 1 jovyan  1000    105 Dec  7 09:57 Dockerfile
drwxr-xr-x 2 jovyan  1000   4096 Dec 10 12:09 .ipynb_checkpoints
-rw-r--r-- 1 jovyan  1000 154229 Dec 10 12:28 post.ipynb

特拉维斯:

drwxrwxr-x 2   2000  2000  4096 Dec 10 19:58 .
drwsrwsr-x 1 jovyan users  4096 Nov  8 16:37 ..
-rw-rw-r-- 1   2000  2000   101 Dec 10 19:58 Dockerfile
-rw-rw-r-- 1   2000  2000 35271 Dec 10 19:58 post.ipynb

我的本地机器和 Travis 都是 运行 Ubuntu 20.04,具有相同的 Docker 版本,所有其他工具都来自 Conda,因此应该表现相同。我很难理解所有权差异的来源。

使用此命令再次尝试 运行 和 docker,因此容器外部的 uid 会在内部传播:

docker run -u `id -u`

替代方案,如 @anemyte 所指出:

docker run -u $(id -u)

这应该涉及在 docker 中创建新文件,归 "jovyan" 所有。

如果你能猜到安装点存在,你也可以预先创建它们,这样里面文件的所有权也是正确的:

docker run -v /path/on/host:/path/in/container ...

如果您将本地路径 (/path/on/host) 的权限设置为 777,这也将传播到安装点:无论 [=33] 的用户如何,都不会抛出权限错误=] 用于创建这些文件。

之后,如果需要,您可以自由恢复权限。