如何在不删除任何图层的情况下删除docker图像上的标记

如何在不删除任何图层的情况下删除docker图像上的标记,docker,Docker,我可以使用docker-image-rm--no-prune-my:image保留大部分图层;但我发现它会移除最后一层 一个简化的例子: Dockerfile: FROM alpine RUN echo "hello" RUN echo "world" 构建it: $docker build——标记我的:图像。 正在将生成上下文发送到Docker守护程序2.048kB 步骤1/3:从阿尔卑斯山 最新版本:从图书馆/阿尔卑斯山 89d9c30c1d48:拉动完成 摘要:sha256:C19173

我可以使用
docker-image-rm--no-prune-my:image
保留大部分图层;但我发现它会移除最后一层

一个简化的例子:

Dockerfile:

FROM alpine
RUN echo "hello"
RUN echo "world"
构建it:

$docker build——标记我的:图像。
正在将生成上下文发送到Docker守护程序2.048kB
步骤1/3:从阿尔卑斯山
最新版本:从图书馆/阿尔卑斯山
89d9c30c1d48:拉动完成
摘要:sha256:C19173C5ADA601A598915111163D28A6736836276253D8A8121CE95CF2BD5A
状态:为alpine下载了更新的图像:最新
--->965ea09ff2eb
步骤2/3:运行echo“hello”
--->在dff99f3e8991中运行
你好
拆卸中间容器dff99f3e8991
--->bffa49d7d012
步骤3/3:运行echo“世界”
--->在20101e7149ba中运行
世界
拆卸中间容器20101e7149ba
--->9f6a7f60fd0d
已成功构建9f6a7f60fd0d
已成功标记my:图像
然后再次构建它:

$docker build——标记我的:图像。[16:59:58]
正在将生成上下文发送到Docker守护程序2.048kB
步骤1/3:从阿尔卑斯山
--->965ea09ff2eb
步骤2/3:运行echo“hello”
--->使用缓存
--->bffa49d7d012
步骤3/3:运行echo“世界”
--->使用缓存
--->9f6a7f60fd0d
已成功构建9f6a7f60fd0d
已成功标记my:图像
请注意,这些步骤是缓存的。现在,如果我使用
--no prune
删除图像,cli将报告它已删除一个SHA:

$docker image rm--不修剪我的:图像
未标记:我的:图像
已删除:sha256:9f6a7f60fd0ddf06d079e9d1a5bd608a7dd85f6f00e7bacc79082a8ea4dc6601
现在,当我重建图像时,将重建最后一层:

$docker build——标记我的:图像。
正在将生成上下文发送到Docker守护程序2.048kB
步骤1/3:从阿尔卑斯山
--->965ea09ff2eb
步骤2/3:运行echo“hello”
--->使用缓存
--->bffa49d7d012
步骤3/3:运行echo“世界”
--->在f09302ce5295中运行
世界
拆卸中间容器f09302ce5295
--->224a0d5007dd
成功构建224a0d5007dd
已成功标记my:图像

如何防止docker在从图像中删除标签的同时删除最后一层?

因此我放弃了寻找解决方案的尝试;只是用了黑客版本

通过使用另一个标记标记图像,删除图像不会删除任何层。然后将该标记移动到另一个图像仍然不会删除图像层。因此,要保留所有图层,您需要:

docker image tag my:image tmp
docker image rm my:image
显然,这会留下
tmp
图像,因此我们可以以类似的方式删除它(其中
alpine
是您保留的图像):

无需对这些层使用
--无删减
,因为如果有其他层引用,docker不会删除这些层

docker image tag alpine tmp
docker image rm tmp