每次构建docker映像时,它似乎都在5-10mb内增长,而没有明显的原因。
每次构建时,我都会在红宝石中添加一行注释。
以下是3张图像,这些图像是通过对代码进行单行更改并从根开始依次运行docker -it <img_id> /bin/sh
和du -d1
来构建的。这3个文件没有块/文件大小差异。
关于为什么每次构建会丢失5-10mb的任何想法?
9add242d3e75 2 hours ago 438MB
# du -d1
4 ./run
1472 ./var
4 ./opt
4 ./tmp
4972 ./lib
0 ./proc
4 ./srv
4 ./mnt
359692 ./usr
16 ./media
264 ./sbin
0 ./dev
0 ./sys
1740 ./etc
1084 ./bin
8 ./root
4 ./home
42024 ./app
411300 .
45ed1ea39f3a 13 hours ago 432MB
# du -d1
4 ./run
1472 ./var
4 ./opt
4 ./tmp
4972 ./lib
0 ./proc
4 ./srv
4 ./mnt
359692 ./usr
16 ./media
264 ./sbin
0 ./dev
0 ./sys
1740 ./etc
1084 ./bin
8 ./root
4 ./home
42024 ./app
411300 .
4740856ed1b7 13 hours ago 421MB
# du -d1
4 ./run
1472 ./var
4 ./opt
4 ./tmp
4972 ./lib
0 ./proc
4 ./srv
4 ./mnt
359692 ./usr
16 ./media
264 ./sbin
0 ./dev
0 ./sys
1740 ./etc
1084 ./bin
8 ./root
4 ./home
42024 ./app
411300 .
[编辑]
使用潜水,我能够看到膨胀来自于COPY
命令,该命令的大小确实有所增加(tmp /文件夹),但是我有一个针对rm -rf tmp
的特定命令来回收该空间。
似乎COPY
正在缓存大小?
即使我删除引起尺寸差异的东西,最终的图像尺寸仍然保留吗?
COPY显示tmp / w /膨胀RUN rm -rf tmp
消除膨胀
答案 0 :(得分:0)
在这里找到答案:https://forums.docker.com/t/why-run-command-which-deletes-files-inflates-image-size/33670/6
这是预期的行为,因为COPY
正在引入文件。
有一个实验性的--squash
标志(截至19年10月)可以在docker build
上使用,但它失去了图层的主要优势。
我将不得不想出另一种方案,以避免将文件通过tmp文件夹导入。
[编辑] 我最终使用中介容器“剥离”了我不想要的东西。
ARG BUILDER_REPO='replace-repo'
FROM ${BUILDER_REPO} as build_img
WORKDIR /app
RUN rm -rf tmp
FROM ruby:2.6.5-alpine
WORKDIR /app
COPY --from=build_img /app .
从200mb -> 140mb
起对我非常有用
答案 1 :(得分:0)
尚无法评论,因此必须在此处输入。您的最后一个答案听起来不错。只要您的Dockerfile中有COPY,映像的大小就会增加到您要复制的内容。即使以后有RUN rm -rf,您的映像仍然保持不变,因为执行RUN rm -rf tmp的Docker层与COPY层是分开的。因此,执行COPY的第一层会增加要复制对象的大小。然后,您将具有RUN层,该层将删除tmp。因此,换个角度来看,就像您的RUN层删除tmp一样,tmp首先需要填充COPY层的内容。因此,即使在RUN层执行后,您应该清空了tmp,该层仍然需要从前一层中删除的数据。
避免这种情况的一种方法是使用Docker卷。您可以使用docker run,同时将要装载的卷以及要在容器内部装载的目录传递给它。查看这篇帖子How to mount host volumes into docker containers in Dockerfile during build,他们将讨论执行此操作的不同选择