如何在构建后从构建中删除中间图像?

And*_*ykh 7 docker

使用时构建多阶段Dockerfile

docker build -t myimage .
Run Code Online (Sandbox Code Playgroud)

它产生标记的最终图像myimage,以及中间图像.要完全清楚,我们在这里谈的不是关于容器,而是关于图像.它看起来像这样:

在此输入图像描述

看到这些<none>图片?这就是我所说的.

现在,在这里和这里已经讨论了这个"问题" .

以下是一些相关部分:

如果这些中间图像将被自动清除/修剪,则构建缓存将随每次构建而消失,因此强制您每次都重建整个图像.

好吧,自动修剪是没有意义的.

有些人这样做:

现在,我正在使用docker image prune -f我的docker build -t app .命令来清理那些中间图像.

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

它删除了"所有悬空图像",因此在共享环境(如Jenkins奴隶)中,它更像是在脚下射击.:)

这是我发现自己的一个场景.

所以没有什么可以在Docker端"修复".但是,如何从一个特定的构建中删除那些额外的图像呢?

d4n*_*yll 7

由于ZachEddy和提到在你的链接,你可以标记中间图像的问题之一,并基于此标签上的图像。thaJeztah docker image prune

Dockerfile(使用多阶段构建)

FROM node as builder
LABEL stage=builder
...

FROM node:dubnium-alpine
...
Run Code Online (Sandbox Code Playgroud)

生成图像后,运行:

$ docker image prune --filter label=stage=builder
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 在您的Jenkins构建中将唯一的构建ID设置为环境变量
  2. ARG在您的内部添加此版本ID 的说明Dockerfile
  3. docker build通过--build-arg标记传递构建ID
FROM node as builder
ARG BUILD_ID
LABEL stage=builder
LABEL build=$BUILD_ID
...

FROM node:dubnium-alpine
...
Run Code Online (Sandbox Code Playgroud)
$ docker build --build-arg BUILD_ID .
$ docker image prune --filter label=stage=builder --filter label=build=$BUILD_ID
Run Code Online (Sandbox Code Playgroud)

如果要在映像中保留构建ID(可能是容器中可访问的一种文档形式),则可以添加另一条ENV采用ARGbuild参数值的指令。这还允许您使用类似的环境替换将标签值设置为内部版本ID。

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

FROM node:dubnium-alpine
...
Run Code Online (Sandbox Code Playgroud)


小智 5

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

sed -i '/^FROM/a\
LABEL build_id=${env.BUILD_TAG}\
' Dockerfile
Run Code Online (Sandbox Code Playgroud)

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