为什么 `chmod` 导致 `docker build` 到 运行 out of disk space

Why does `chmod` cause `docker build` to run out of disk space

所以我的 Docker 构建基本上完成了,我只需要递归地 chownchmod 一个大目录。

以下是 docker build 的部分输出:

Step 34/40 : RUN du -b -m -s / 2>/dev/null || true
 ---> Running in d261dfc7a9f8
1537    /
Removing intermediate container d261dfc7a9f8
 ---> 663d129f1487
Step 35/40 : RUN df --si -m /;df -i /;
 ---> Running in 8249096d3069
Filesystem     1M-blocks  Used Available Use% Mounted on
overlay            29674 28609      1066  97% /
Filesystem           Inodes  IUsed   IFree IUse% Mounted on
overlay             2737520 549839 2187681   21% /
Removing intermediate container 8249096d3069
 ---> fc4250e3433d
Step 36/40 : RUN chmod -R a+rwX /var/www/html
 ---> Running in 2705265de405
Error processing tar file(exit status 1): open /var/www/html/[...].php: no space left on device

我通过 运行 docker system prune -a 解决了我的问题,释放了额外的 908 MB,但我不明白为什么磁盘 space 首先是一个问题(更不用说 tar 与它有什么关系...)。

运行 watch df -m / 我可以清楚地看到 chmod 导致了几个 100MB 的大幅波动(下降 上升),但是这没有任何意义,因为 chmod 不应更改磁盘分配,即使是 CoW(写时复制)文件或稀疏文件也不应如此。

为什么 chmod 的 docker 实施(我正在使用 FROM centos:7.4.1708)会导致使用额外的磁盘 space?

不是 chmod 导致了额外的磁盘 space。 Dockerfile 中的 run 命令会创建一个层缓存,它会耗尽您的磁盘 space。我建议使用 &&.

汇总您 运行 的命令

docker 中的文件系统层是使用写时复制解决方案实现的。对文件的任何更改都会首先生成该文件的副本,然后更改会应用于该文件副本,甚至是权限、所有者或时间戳。 chown 和 chmod 命令,当 运行 递归时,将更改文件的时间戳,即使没有更改权限。

因此,为了最小化 docker 中层的大小,对同一层中的文件进行所有更改。每个步骤都会创建一个新层,因此将更改合并到同一步骤中。使用 COPY 命令,修复源的权限并查看调整所有权的选项。对于 RUN,您经常会看到使用 && 语法链接的命令以压缩为一个步骤。这在创建临时文件时尤为重要,因为您需要在步骤完成之前删除它们以避免将它们写入图像层。