首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当文件不改变时,Docker图像的大小会增加。

当文件不改变时,Docker图像的大小会增加。
EN

Stack Overflow用户
提问于 2019-10-18 01:47:38
回答 2查看 947关注 0票数 1

每次我建立我的码头形象,它似乎增长了5-10毫巴,没有明显的原因。

每次我构建的时候,我都会给红宝石添加一行注释。

下面是3个图像,它们是通过对代码进行一行修改生成的,然后运行docker -it <img_id> /bin/sh,然后从根目录运行du -d1。所有三个都没有块/文件大小的差异。

你知道我为什么每次要损失5-10毫巴吗?

代码语言:javascript
复制
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去除肿胀

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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文件夹导入文件,我必须想出一个不同的方案。

编辑我最终使用中间容器‘剥离’我不想要的东西。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 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,在这里他们讨论了不同的选项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58442868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档