【问题标题】:How to remove intermediate images from a build after the build?构建后如何从构建中删除中间图像?
【发布时间】:2022-04-29 21:48:17
【问题描述】:

当您使用构建多阶段 Dockerfile 时

docker build -t myimage .

它生成标记为myimage 的最终图像,以及中间图像。为了完全清楚,我们在这里谈论的不是容器,而是图像。它看起来像这样:

看到这些<none> 图像了吗?这些就是我要说的。

现在herehere已经在一定程度上讨论了这个“问题”。

以下是一些相关部分:

如果这些中间图像会被自动清除/修剪,则每次构建都会删除构建缓存,因此会强制您每次都重新构建整个图像。

好吧,然后自动修剪是没有意义的。

有些人这样做:

目前,我在我的docker build -t app . 命令之后使用docker image prune -f 来清理这些中间图像。

但不幸的是,这不是我能做的。正如一位讨论参与者评论的那样:

它会删除“所有悬空的图像”,因此在共享环境中(如 Jenkins slave),它更像是在自己的脚上开枪。 :)

这是我发现自己所处的场景。

所以在 Docker 方面没有什么需要“修复”的。但是我如何才能删除那些额外的图像,仅从单个特定版本

更新

在阅读了下面 d4nyll 的非常好的回答之后,这是向前迈出的一大步,我想为这个问题添加更多限制;)首先,让我总结一下答案:

  • 可以使用 ARG 将构建 ID 从 CI/CD 传递给 Dockerfile builder
  • 然后可以使用LABEL 语法将构建ID元数据添加到正在构建的舞台图像中
  • 然后可以使用docker image prune 命令的--filter 选项仅删除具有当前构建ID 的图像

向前迈出了一大步,但我仍在努力研究如何在不增加不必要的复杂性的情况下将其融入我的使用场景。

在我的情况下,要求是编写 Dockerfile 并将其签入源代码控制系统的应用程序开发人员负责确保他们的 Dockerfile 构建的映像令他们满意。他们不需要以特定方式制作所有 Dockerfile,“因此我们的 CI/CD 流程不会中断”。他们只需提供一个Dockerfile 即可生成正确的 docker 镜像。

因此,我真的不能要求他们在Dockerfile 中为每个应用程序添加内容,只是为了 CI/CD 管道。这是 CI/CD 管道应自行处理的所有事情。

我认为实现这项工作的唯一方法是编写一个Dockerfile 解析器,它将检测多阶段构建并在每个阶段注入一个标签,然后构建修改后的Dockerfile。这是一个我非常不愿意添加到 CI/CD 管道中的复杂性。

我有更好(读起来更简单)的选择吗?

【问题讨论】:

  • 你有没有试过用这个来清理悬挂的图像:- docker rmi $(docker images -f "dangling=true" -q)
  • @kakabali 是的,它奏效了。但对解决手头的问题没有帮助。
  • 抱歉 :-( . 可能有一个单独的区域(另一个内部安装了 docker 的 docker 镜像),您可以在其中推送和镜像到注册表,然后在事后删除这个容器/镜像已经结束了
  • @kakabali docker 在 docker 中不能很好地工作,这是许多人从经验中发现的已知事实,并且 docker 开发人员不建议明确使用它。有很多微妙的问题。如果你有兴趣,谷歌一下。
  • @AndrewSavinykh 有趣的是没有人提到,在重新启动系统后,这些“悬空”图像从 'docker images' 中消失了

标签: docker docker-build


【解决方案1】:

作为ZachEddythaJeztah mentioned 在您链接到的问题之一中,您可以根据此标签标记中间图像和docker image prune 这些图像。

Dockerfile(使用多阶段构建)

FROM node as builder
LABEL stage=builder
...

FROM node:dubnium-alpine
...

构建映像后,运行:

$ docker image prune --filter label=stage=builder

对于自动化服务器(例如 Jenkins)

如果您在自动化服务器(例如 Jenkins)中运行构建,并且只想从该构建中删除中间图像,您可以

  1. 将唯一的构建 ID 设置为 Jenkins 构建中的环境变量
  2. 在您的 Dockerfile 中为此构建 ID 添加一个 ARG 指令
  3. 通过 --build-arg 标志将构建 ID 传递给 docker build
FROM node as builder
ARG BUILD_ID
LABEL stage=builder
LABEL build=$BUILD_ID
...

FROM node:dubnium-alpine
...
$ docker build --build-arg BUILD_ID .
$ docker image prune --filter label=stage=builder --filter label=build=$BUILD_ID

如果您想在映像中保留构建 ID(可能作为可在容器中访问的文档形式),您可以添加另一个 ENV 指令,该指令采用 ARG 构建参数的值。这也允许您使用类似的environment replacement 将标签值设置为构建 ID。

FROM node as builder
ARG BUILD_ID
ENV BUILD_ID=$BUILD_ID
LABEL stage=builder
LABEL build=$BUILD_ID
...

FROM node:dubnium-alpine
...

【讨论】:

  • @AndrewSavinykh 也许您可以在 Jenkins 构建中设置一个唯一的构建 ID 作为环境变量,使用 ENV 将其添加到映像中,然后使用 environment replacement 将该构建 ID 用作标签价值
  • 是的,您需要修改 Dockerfile 以包含 ENVLABEL 指令。我不确定为什么这是一个复杂的程序,您介意澄清一下吗?
  • LABEL 指令不会干扰您的构建过程。标签是docker 守护程序使用的纯元数据。图像本身的“内部”没有任何变化。我建议您更仔细地阅读文档,因为这正是 LABEL 结构的用途。如果您发现自己实现了自己的 Dockerfile 解析器,那么您的事情就过于复杂了。
【解决方案2】:

我们正在这样做,在构建时将标签应用到 Dockerfile,如下所示:

sed -i '/^FROM/a\
LABEL build_id=${env.BUILD_TAG}\
' Dockerfile

帮助 OP 可能为时已晚,但希望这对面临同样问题的人有用。

【讨论】:

  • 这是有道理的。谢谢你分享这个。
【解决方案3】:

简单的方法是运行 cmd docker rmi -f $(docker images -f "dangling=true" -q)

【讨论】:

  • 一个更简单的方法是运行docker image prune,因为它默认只清理悬空图像。 docs.docker.com/config/pruning
  • 这个问题非常详细地解释了为什么这不是我们正在寻找的答案。您是否阅读了整个问题?
【解决方案4】:

您可以运行 docker build 插入另一个参数,这将自动删除中间图像:

docker build --force-rm -t myimage .

【讨论】:

  • 这个问题是关于 multi-stage build 并从这种特定类型的构建中删除图像。你的建议没有解决。求婚前自己试过了吗?
【解决方案5】:

有点晚了,但最好的选择是

docker builder prune -a

【讨论】:

  • 这不会像问题中的粗体那样仅从单个特定构建中删除图像
【解决方案6】:

如果您根本不想使用缓存,可以在 docker build 命令中使用 --no-cache=true 选项

Leverage build cache

【讨论】:

  • 这个问题是关于 multi-stage build 并从这种特定类型的构建中删除图像。你的建议没有解决。求婚前自己试过了吗?
  • 你是对的,但是主题是错误的,谷歌在stackoverflow中导致了这个答案。所以没用
【解决方案7】:

请使用以下命令删除所有中间图像:

docker rmi $(docker images -a|grep "<none>"|awk '$1=="<none>" {print $3}')

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 简要描述您的命令的作用以及是否有任何副作用。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多