每次我建立我的码头形象,它似乎增长了5-10毫巴,没有明显的原因。
每次我构建的时候,我都会给红宝石添加一行注释。
下面是3个图像,它们是通过对代码进行一行修改生成的,然后运行docker -it <img_id> /bin/sh,然后从根目录运行du -d1。所有三个都没有块/文件大小的差异。
你知道我为什么每次要损失5-10毫巴吗?
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 .使用dive进行编辑时,我能够看到膨胀来自一个COPY命令,它的大小确实增加了( tmp/文件夹),但是我有一个特定的命令rm -rf tmp来恢复这个空间。
COPY是否正在缓存大小?
虽然我正在删除导致大小差异的东西,但最终的图像大小仍然存在吗?
显示tmp/ w/胀的副本

RUN rm -rf tmp去除肿胀

发布于 2019-10-18 04:35:30
在这里找到答案:https://forums.docker.com/t/why-run-command-which-deletes-files-inflates-image-size/33670/6
这是预期的行为,因为COPY正在引入文件。
有一个实验性的(截止到10月19日)标志--squash可以在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
发布于 2019-10-18 04:52:35
还不能评论,所以必须在这里键入它。你的最后一个答案听起来是对的。只要您的Dockerfile中有一个副本,图像的大小就会增加到您复制的内容。即使稍后有一个运行rm -rf,您的映像仍然保持相同的大小,因为执行rm -rf tmp的Docker层与复制层是分开的。所以,第一层,复制,增加到你要复制的东西的大小。然后是运行层,它删除了tmp。因此,要将其放到另一个透视图中,就像运行层删除tmp一样,tmp首先需要填充复制层的内容。因此,即使在运行层执行之后,您应该已经清空了tmp,但该层仍然需要它应该从前一层删除的数据。
避免这种情况的一种方法是使用Docker卷。您可以在传递要挂载的卷和在容器内挂载它的目录时使用docker运行。查看这篇文章How to mount host volumes into docker containers in Dockerfile during build,在这里他们讨论了不同的选项。
https://stackoverflow.com/questions/58442868
复制相似问题