docker 当你推一个新的图像与相同的旧标签会发生什么?

rqdpfwrv  于 2023-05-22  发布在  Docker
关注(0)|答案(2)|浏览(127)

我是Docker的新手。
我已经容器化了我的Django应用程序,当我运行容器时,它成功地在暴露的端口上运行。
我想知道当我更新我的应用程序(在代码中进行更改)并再次构建图像并再次标记为“最新”时会发生什么,而我已经有一个图像“最新”?它会取代旧的形象吗?

oewdyzsn

oewdyzsn1#

简短的回答:是的,新的标签“覆盖”了前一个标签
较长的答案:标签的工作方式有点类似于Git中的标签;标签引用图像的特定版本(内容可寻址摘要),并且可以被更新以指向不同的版本。
覆盖标签时,旧图像本身不会被覆盖,但标签现在指向您推送的图像的新版本。如果您通过其摘要引用旧映像,则仍然可以提取(并运行)旧映像。
例如,当你拉取busybox:latest图像时,你会看到它的摘要在拉取后打印出来:

docker pull busybox:latest

# 7c9d20b9b6cd: Pull complete 
# Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
# Status: Downloaded newer image for busybox:latest
# docker.io/library/busybox:latest

因此,除了上面的方法,你也可以通过 digest 来提取图像:

docker pull busybox@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e

# sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e: Pulling from library/busybox
# Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
# Status: Image is up to date for #busybox@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
# docker.io/library/busybox@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e

虽然新版本的busybox:latest镜像可能会出现在Docker Hub上,但如果您知道它们的摘要,您仍然可以运行旧版本;

docker run --rm busybox@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e echo 'hello from busybox'

# hello from busybox
rbl8hiat

rbl8hiat2#

如Manifest摘要部分所述,使用现有标记推送修改后的图像取消标记先前推送的图像,导致孤立(或“悬空”)图像。以前推送的映像清单及其层数据仍保留在注册表中。考虑以下事件顺序:
1.推送图片 acr-helloworld,标签为latestdocker push myregistry.azurecr.io/acr-helloworld:latest
1.检查存储库 acr-helloworld 的清单:
Azure CLI

az acr manifest list-metadata --name acr-helloworld --registry myregistry

输出

[
  {
    "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
    "tags": [
      "latest"
    ],
    "timestamp": "2018-07-11T21:32:21.1400513Z"
  }
]

1.修改 acr-helloworld Dockerfile
1.推送图片 acr-helloworld,标签为latestdocker push myregistry.azurecr.io/acr-helloworld:latest
1.检查存储库 acr-helloworld 的清单:
Azure CLI

az acr manifest list-metadata --name acr-helloworld --registry myregistry

输出

[
  {
 "architecture": "amd64",
 "changeableAttributes": {
   "deleteEnabled": true,
   "listEnabled": true,
   "quarantineDetails": "{\"state\":\"Scan Passed\",\"link\":\"https://aka.ms/test\",\"scanner\":\"Azure Security Monitoring-Qualys Scanner\",\"result\":{\"version\":\"2020-05-13T00:23:31.954Z\",\"summary\":[{\"severity\":\"High\",\"count\":2},{\"severity\":\"Medium\",\"count\":0},{\"severity\":\"Low\",\"count\":0}]}}",
   "quarantineState": "Passed",
   "readEnabled": true,
   "writeEnabled": true
 },
 "configMediaType": "application/vnd.docker.container.image.v1+json",
 "createdTime": "2020-05-16T04:25:14.3112885Z",
 "digest": "sha256:eef2ef471f9f9d01fd2ed81bd2492ddcbc0f281b0a6e4edb700fbf9025448388",
 "imageSize": 22906605,
 "lastUpdateTime": "2020-05-16T04:25:14.3112885Z",
 "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
 "os": "linux",
 "timestamp": "2020-05-16T04:25:14.3112885Z"
  }
]

当图像未标记时,标记数组将从元数据中删除。此清单仍然存在于注册表中,沿着它引用的任何唯一层数据。要删除此类孤立镜像及其图层数据,必须按清单摘要删除
上面的文章来自Azure Container Registry

相关问题