减少 Docker 容器大小

2024-04-13

我正在关注有关 Docker 的在线教程。作者举了这样一个例子:

FROM busybox
RUN dd if=/dev/zero of=/tmp/test1 bs=1M count=50
RUN dd if=/dev/zero of=/tmp/test2 bs=1M count=50
docker image ls
FROM busybox
RUN dd if=/dev/zero of=/tmp/test1 bs=1M count=50
RUN dd if=/dev/zero of=/tmp/test2 bs=1M count=50
RUN rm -rf /tmp/test1
RUN rm -rf /tmp/test2
docker image ls

为什么第二个 Dockerfile 显示的大小没有变小?

如何在不删除 RUN dd 命令的情况下使第二个 docker 映像 ls 显示较小的映像?


Docker 以及一般的容器引擎都使用联合挂载文件系统概念。
联合安装 https://en.wikipedia.org/wiki/Union_mount是一种将多个目录组合成一个看起来包含其组合内容的目录的方法。

因此,图像实际上是由原子不可变文件夹(又名“层”)组成。
该机制的主要目标是重复数据删除。
一层可以由多个图像共享,从而节省大量存储空间。

例如您下载 CentOS 基础映像 (700mb) 并在其上构建多个自定义映像。
CentOS 的大部分仍然存储一次 - 您的图像只是引用它。

Anoher 好答案 https://stackoverflow.com/a/32776204/4486909- 旧的,但仍然相关。


当你使用 Dockerfile 构建镜像时,Dockerfile 中的每个单独的命令都会生成一个新层,将其放在前一个之上(或“合并”它们 - 就联合文件系统而言)。
生成的图像将包含所有中间层在您的构建过程中创建。

FROM busybox
# layer 1: added test1 50 mb
RUN dd if=/dev/zero of=/tmp/test1 bs=1M count=50

# layer 2: added test2 50 mb
RUN dd if=/dev/zero of=/tmp/test2 bs=1M count=50

# layer 3: "removed" test1, but actually test1 still lives in layer 1
# "removal" just made it invisible for upper layers
# that is how removal works in union mount file systems
# technically, in terms of UFS, it's not a "removal", but a "merge" of layer 3 with layer 1
RUN rm -rf /tmp/test1

# layer 4: same as layer 3
RUN rm -rf /tmp/test2

节省空间的常见方法是将 shell 命令链接到单个 RUN 指令下。

# in this case only one layer will be created
# it will contain eventual state of the filesystem after full command chain completion
RUN dd if=/dev/zero of=/tmp/test1 bs=1M count=50 && \
    dd if=/dev/zero of=/tmp/test2 bs=1M count=50 && \
    rm -rf /tmp/test1 && \
    rm -rf /tmp/test2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

减少 Docker 容器大小 的相关文章

随机推荐

  • 大浮点和的精度

    我正在尝试对正递减浮点数的排序数组求和 我发现对它们求和的最佳方法是开始从最低到最高将数字相加 我编写此代码是为了提供一个示例 但是 从最高数字开始的总和更精确 为什么 当然 1 k 2之和应该是f 1 644934066848226 in
  • 在 Java 循环中重新声明变量

    在Java中 我们不能将一个变量与另一个同名变量声明在同一作用域中 int someInteger 3 int someInteger 13 语法错误 无法编译 但是 如果我们将其放入循环中 for int i 0 i lt 10 i in
  • Google 云端硬盘哑剧类型列表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 As per https developers google com drive manage uplo
  • 如何避免右侧滚动条与顶部导航栏(引导程序)重叠?

    我有一个网站 导航栏固定在顶部 导航栏位于左侧 当网站需要滚动时 右侧的滚动条与顶部导航栏重叠 我希望导航栏从顶部导航栏下方开始 我摆弄了一个问题的例子 https jsfiddle net jsmnsLm7 https jsfiddle
  • 不受信任的 URL 字符串的安全 Process.Start 实现

    我的目标是在用户默认浏览器中安全地打开网页 该网页的 URL 被视为 不受信任 将其视为使用该软件打开的文档中的链接 但该文档可能来自任何地方 并且其中的链接可能是恶意的 我想避免有人将 C Windows malicious code e
  • 来自连接表的 SQL 计数

    我有一个表 lijsten 一个表 werknemerlijsten 和一个表 categorieen 现在我正在使用查询来获取计数 SELECT id naam beschrijving count wl werknemer id as
  • 复杂的查询应该写在Repository层还是Service层?

    我计划将我们的数据访问层迁移到使用存储库模式和工作单元 我确实知道存储库将帮助我轻松地将持久性存储 数据库 集合等 和技术 例如 EF 更改为 MongoDB 所以我注意到存储库实现的一些关键点 例如 Return IEnumerable代
  • 从数组 THREE.js 创建纹理

    我正在研究地形生成器 但我不知道如何处理颜色 我希望能够生成一张占据整个 PlaneGeometry 的图像 我的问题是如何根据我的高度图创建一个覆盖整个 PlaneGeometry 没有环绕 的单个图像 我可以想到一种方法 但我不确定它是
  • 更改 TabBarItem 的 ViewController

    是否可以更改 替换 UITabBarController 中选项卡之一的 ViewController 和 View 我想从特定选项卡以任意顺序在 3 个不同的视图控制器之间切换 这就是导航控制器不可能的原因 它们是使用 setViewCo
  • 为什么 TBitBtn 中包含的字形如此丑陋且过时? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Jetty 通过 Maven 正确运行,但作为 jar 运行不正确

    如果我的标题具有误导性 不正确 请提出更具描述性的内容 这是我能想到的最好的内容 我已经使用 spring roo 创建了自己的网络应用程序 但尚未编辑任何代码 我正在使用 Maven 和 jetty 构建并运行 Web 应用程序 当我执行
  • 使用 javascript 自动增加 firebase 中的值

    你好 我正在开发一些 firebase 项目 我可以通过 javascript 将我的数据保存到 firebase 数据库中 但我无法弄清楚如何自动增加数据库的子值 我的子值是 duyuru 您可以在下面看到详细信息 我在下面分享我的代码
  • 如何使用 Groovy 修剪列表中的所有元素?

    我需要在 groovy 或 grails 中修剪列表中的所有元素 最好的解决方案是什么 假设它是一个字符串列表 并且您想要修剪每个字符串 您可以使用扩展运算符 http groovy codehaus org Operators Opera
  • 从数组随机 URL 重定向

    政治动物 contentscript js 加载到清单 json 中列出的每个页面上 该插件将新闻网站网站上的所有图像替换为以下图片 穿西装的动物 作为对新闻的评论 专为 Web 2 打造 2013 年 11 月 20 日 随机图像数组 v
  • 以编程方式将 TabLayout 中的选项卡文本颜色更改为不同颜色

    我的屏幕上有 7 个日期选项卡 选择选项卡时 文本为黑色 而其他可选选项卡的颜色为白色 如果日期是另一个月 我希望文本颜色为灰色 我假设第一个选项卡是 0 第二个选项卡是 1 一直持续到 6 如图所示 我想更改选项卡 3 选项卡 4 选项卡
  • Activity 恢复时的 Android 内部类 TextView 参考

    我有一个扩展 CountDownTimer 的内部类 基本上它是一个简单的倒计时器 用于更新活动中的 TextView 并在计时器完成时播放声音 内部类的代码是 public class SetTimer extends CountDown
  • Python 3.2 有等效的 PyMongo 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试安装pymongo通过 Python 3 2 到我的 Windows 机器简易安装 却发现由于与Python 3 2不兼容而无法安装
  • 什么是 std::false_type 或 std::true_type?

    我看到它的用法如下 template
  • 何时使用 RecoveryCallback 与 KafkaListenerErrorHandler

    我想了解什么时候应该使用 org springframework retry RecoveryCallback 和 org springframework kafka listener KafkaListenerErrorHandler 截
  • 减少 Docker 容器大小

    我正在关注有关 Docker 的在线教程 作者举了这样一个例子 FROM busybox RUN dd if dev zero of tmp test1 bs 1M count 50 RUN dd if dev zero of tmp te