为什么 `chmod` 导致 `docker build` 到 运行 out of disk space
Why does `chmod` cause `docker build` to run out of disk space
所以我的 Docker 构建基本上完成了,我只需要递归地 chown
和 chmod
一个大目录。
以下是 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
,您经常会看到使用 &&
语法链接的命令以压缩为一个步骤。这在创建临时文件时尤为重要,因为您需要在步骤完成之前删除它们以避免将它们写入图像层。
所以我的 Docker 构建基本上完成了,我只需要递归地 chown
和 chmod
一个大目录。
以下是 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
,您经常会看到使用 &&
语法链接的命令以压缩为一个步骤。这在创建临时文件时尤为重要,因为您需要在步骤完成之前删除它们以避免将它们写入图像层。