2

我正在尝试理解以下命令

docker image prune
docker image prune -a

根据文档

docker image prune:删除悬空图像

docker image prune -a:删除悬空和未使用的图像`

我试图了解悬空图像和未使用图像之间的区别。

根据this stackoverflow post,未使用的图像是尚未在容器中分配或使用的图像。

所以基本上,如果我跑

docker pull hello-world

(从未执行过命令docker run hello-world

那么 hello-world 的图像将是未使用的图像?

那么悬空图像是如何创建的呢?

根据上面引用的堆栈溢出帖子,“悬空图像只是意味着您已经创建了图像的新版本,但它没有被赋予新名称。所以你拥有的旧图像成为'悬空图像'。 "

这到底是什么意思呢?即,创建图像的新版本是什么意思?您如何创建图像的新版本?什么是未标记图像?

有人可以给我一个如何创建悬空图像的例子吗?

4

3 回答 3

3

悬空图像只是意味着您有一个图像,但它没有附加任何标签。(修剪未使用的 Docker 对象

你如何达到它?通过构建具有相同名称和相同标签的图像。这是常见的情况,不是唯一的。

  1. 您构建一个图像my.image.example.com并用latest.
  2. 您可以通过将其引用为来推/拉您的图像my.image.example.com:lastest
  3. 你做了一些改变,并重建了你的形象。与您在步骤 1 中所做的相同。
  4. 您有一个新的图像 ID,具有相同的名称和相同的标签。
  5. 第一个图像现在是悬空的,您只能使用它的完整 SHA 来解决它。

这是对图像标签是什么的非常高级和抽象的描述;

大多数(如果不是全部)计算机软件都是由名称和版本组成的。例如,您的操作系统可能是 Windows 10、OSX Catalina (14 Mojave) 等。

在容器世界中,图像标签用于处理软件的版本。图像名称 - 是软件本身。

下载图像时,您指定图像名称及其“版本”(即标签)。这是常见的用例。标签可用于多种用途;单个图像可以有多个标签,但不能有一个标签引用多个图像。

我认为Docker 概述可能是了解平台基本背景的好地方

于 2020-02-06T21:16:59.367 回答
2

假设你基于一个带有标签“asool/user-service”的 Dockerfile 构建一个镜像:

docker build -t asool/user-service .

映像已成功构建,ID 为“5e8d606c6dcc”。因此,您更改该 Dockerfile 的内容,例如添加一行RUN apk add vim. 然后,使用相同的标签“asool/user-service”构建一个镜像:

docker build -t asool/user-service .

创建了一个新图像,标记为“asool/user-service”,具有另一个 ID。虽然出现了一个新图像,但 ID 为“5e8d606c6dcc”的旧图像仍然存在。那幅图像失去了它的标签、它的名字和很可能它的用途。该图像称为悬空图像。

来源:Dockerfile 示例教程 - (第一部分 - 基础知识)

于 2020-02-06T20:46:05.960 回答
1

让我们一一来:

那么 hello-world 的图像将是未使用的图像?

是的。

那么悬空图像是如何创建的呢?

在您的情况下,您可以创建相同图像的新版本,或者您可以取消标记您的图像,然后您就有一个悬空图像

这到底是什么意思呢?即,创建图像的新版本是什么意思?您如何创建图像的新版本?

您可以通过运行命令随时构建映像,docker build甚至可以docker pull从某个地方拉取更新版本。

什么是未标记图像?

每个图像都有一个标签,如文档中所述,您可以使用以下命令重新标记图像: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 当您删除标记或再次构建图像​​时,通常您最终会得到未标记的图像。

有人可以给我一个如何创建悬空图像的例子吗?

好吧,我会说得很简单,只需取消标记任何图像,您就会有一个悬空图像。

最后,这里是这个问题的重复链接: Same question with answer

于 2020-02-06T21:08:28.383 回答