为什么'chmod'会导致'docker build'磁盘空间不足
所以我的Docker构建基本上完成了,我只需要递归地为什么'chmod'会导致'docker build'磁盘空间不足,docker,diskspace,docker-build,Docker,Diskspace,Docker Build,所以我的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 -
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
,释放了额外的908MB,解决了我的问题,但我不明白为什么磁盘空间首先是一个问题(更不用说tar
与它有什么关系……)
运行watch df-m/
我可以清楚地看到chmod
会导致几个100Mb的大幅度波动(上下),但这没有任何意义,因为chmod
不应该改变磁盘分配,即使是CoW(写时复制)文件或稀疏文件也不应该
为什么dockers实施chmod(我使用的是centos:7.4.1708的
)会导致额外的磁盘空间被使用?造成额外磁盘空间的不是chmod
。Dockerfile中的run
命令创建一个层缓存,该层缓存将耗尽您的磁盘空间。我建议您使用docker中的&&
文件系统层来聚合您运行的命令,这些层是通过一个写时拷贝解决方案实现的。对文件的任何更改都会首先生成该文件的副本,然后将更改应用于该文件副本,甚至是权限、所有者或时间戳。当以递归方式运行chown和chmod命令时,即使没有更改权限,也会更改文件上的时间戳
因此,要最小化docker中的层大小,请对同一层中的文件进行所有更改。每一步都会创建一个新层,因此将更改合并到同一步中。使用COPY
命令,修复源上的权限,并查看调整所有权的选项。使用RUN
,您经常会看到使用&&
语法链接的命令被压缩到单个步骤中。这在创建临时文件时尤其重要,因为您需要在步骤完成之前删除它们,以避免将它们写入映像层。在我的系统上,写时复制文件的磁盘使用不受权限、时间戳或附加数据的影响,磁盘使用不受影响。我相信写时拷贝是在单个块级别上完成的,而不是在每个文件级别上。哦,我现在明白了,您在一般意义上指的是“写时拷贝”,但我指的是“写时拷贝”是一个特定的cp--reflink=always
sense。@user3338098 docker的写时拷贝取决于文件系统驱动程序(也称为图形驱动程序). 通常这是覆盖的2,当docker文件中的步骤之间发生更改时,整个文件都会被复制,即使只是权限更改。幸运的是,docker现在会过滤文件上的访问时间戳之类的更改,但是,在docker审查为映像打包层所做的更改之前,仍然有一个来自底层overlay2文件系统的写拷贝。