Dockerfile压缩删除文件夹后镜像层未按预期缩小,如何解决?
Docker镜像层大小优化:压缩大目录后层体积超预期的解决方法
问题原因
Docker镜像的层采用增量存储结构,即便在同一个RUN命令内删除了原大目录,该层依然会记录所有写入过的文件字节数——包括生成原大目录时写入的全部数据,以及后续生成的压缩包。删除操作仅在层中标记文件已删除,不会回溯减少已写入的字节量,因此层的大小会是原目录与压缩包的体积之和。
解决方法
方法1:用tmpfs临时挂载存储大目录
利用Docker构建时的--mount=type=tmpfs参数,将生成大目录的过程放到临时内存文件系统中,tmpfs的内容不会被持久化到镜像层,仅保留最终的压缩包:
RUN --mount=type=tmpfs,target=/tmp/bob_temp \ cd /mypath/ && \ <COMMAND_THAT_GENERATE_HUGE_DIR_BOB> --output-dir /tmp/bob_temp && \ zip -r /mypath/bob.zip /tmp/bob_temp && \ rm -rf /tmp/bob_temp
如果生成命令无法指定输出目录,可先把生成的目录移到tmpfs再处理:
RUN --mount=type=tmpfs,target=/tmp/bob_temp \ cd /mypath/ && \ <COMMAND_THAT_GENERATE_HUGE_DIR_BOB> && \ mv bob /tmp/bob_temp && \ zip -r /mypath/bob.zip /tmp/bob_temp && \ rm -rf /tmp/bob_temp
原理说明
tmpfs是基于内存的临时文件系统,挂载后该目录的所有操作仅在构建阶段的内存中进行,不会写入到Docker的镜像层文件里。最终只有压缩包会被保存到镜像层,因此该层的大小就等于压缩包的体积。
内容的提问来源于stack exchange,提问作者Greg7000
相关产品推荐
相关产品推荐

