【问题标题】:Docker: remove file from intermediate layerDocker:从中间层删除文件
【发布时间】:2019-05-28 15:03:09
【问题描述】:

是否可以从中间 Docker 层中完全删除文件?

例如我有:

Layer A: with BigFile
 L Layer B: remove BigFile
   L Layer C: builds on B

由于文件仍然存在于容器中,即使 BigFile 不可访问,它也存在于 C 中。因此会增加整体图像的大小。

我想要的是从C 中完全删除BigFile

解决办法是什么?只是首先将其从Layer A 中删除吗?

【问题讨论】:

    标签: docker


    【解决方案1】:

    解决办法是什么?是不是一开始就把它从 Layer A 中移除?

    一旦文件在层中,它就不能被删除,但是如果你小心地删除了文件在他们添加它的同一构建步骤中,它就不会被持久化构建步骤的层。

    简单、常见的例子是运行 apt get update,安装包,然后在同一个 RUN 命令中删除包索引,以将 apt 索引保持在镜像层之外。

    https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run 更多地谈论这个例子。

    【讨论】:

    • 我的情况是——出于安全原因,我在中间层下载包。然后,将它们添加到最终图像中。随后使用 RUN 命令安装软件包并删除软件包。我的目标是在 RUN 命令安装它们后删除下载的包。有什么方法可以 a) 将 ADD 和 RUN 合并为一层; b) 删除 ADD 层?
    • 图像压缩可能是明显的解决方案;请参阅下面的@Rory McCune 的回答。您还可以使用多阶段构建从命名的构建阶段复制。
    • 我正在使用多阶段构建。我在第 1 阶段下载包(100mb)。在第 2 阶段,我复制包(ADD --FROM....)并安装它们(运行)。安装后我想摆脱这些包。
    • 酷,好吧,是的,将这些分开的唯一方法是,如果您可以将安装的文件从在单独的阶段中执行 ADD/RUN 的阶段中取出。根据我的建议,使用图像中的包或压缩图层
    • 你的意思是对ADD --FROM...(从上一阶段复制包)和RUN(安装)层进行sqash,然后如何完全删除包?
    【解决方案2】:

    要做到这一点,只要您不介意丢失图像缓存,就可以压缩图像。有几种方法可以做到这一点。

    使用 docker build 上的实验性选项,您将获得一个 --squash 选项,该选项会删除所有中间层并导致 BigFile 不存在。

    如果不这样做,您可以从 C 层创建容器,然后使用 docker export 和 docker import 来有效删除所有层,如this answer中所述

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2023-03-07
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 2011-04-21
      相关资源
      最近更新 更多