Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么'chmod'会导致'docker build'磁盘空间不足_Docker_Diskspace_Docker Build - Fatal编程技术网

为什么'chmod'会导致'docker build'磁盘空间不足

为什么'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 -

所以我的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
,释放了额外的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文件系统的写拷贝。