Docker映像的大小随着文件不变而增加

时间:2019-10-18 01:47:38

标签: docker

每次构建docker映像时,它似乎都在5-10mb内增长,而没有明显的原因。

每次构建时,我都会在红宝石中添加一行注释。

以下是3张图像,这些图像是通过对代码进行单行更改并从根开始依次运行docker -it <img_id> /bin/shdu -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 /膨胀

before deletion showing size difference

RUN rm -rf tmp消除膨胀

bloat removed? no

2 个答案:

答案 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,他们将讨论执行此操作的不同选择

相关问题