如果我使用与现有docker映像相同的名称构建新的docker映像,那么旧的docker映像会被覆盖吗?

78

如果我使用与现有docker镜像相同的名称构建新的镜像,旧的镜像会被覆盖吗?

6个回答

79

Docker中的镜像没有名称,它们有标签。

标签是对镜像的引用。多个标签可能引用同一镜像。

如果您重新分配已使用的标签,则原始镜像将失去该标签,但仍将存在(仍可通过其镜像ID访问,并且其他标签可能会引用它)。


4
它们都有名称和标签。您可以在下面验证。 https://docs.docker.com/v17.09/engine/reference/commandline/build/#options - Gi0rgi0s
5
Docker使用的术语可能有些不一致。“标签”有时指的是“名称:标签”组合,有时仅指后半部分。然而,在构建Docker镜像的上下文中(即在这个问题的上下文中),“--tag”参数确实引用了整个组合,而不仅仅是“:”后面的尾部部分(从您的评论中可以看出,我不确定您想表达什么观点)。 - Thomas Orozco
我并不是在试图表达一个观点。但是我认为,如果你把你评论中的上下文添加到你的回答中会很有用。 - Gi0rgi0s
他们同时拥有名称和标签,因此他们确保使其完美混淆。 - Atul

11

一种简单的清理未使用图像并节省磁盘空间的方法是通过将其添加到~/.bashrc~/.bash_profile来在终端中设置一个清理命令别名:

alias docker_rmi_dangling="docker rmi $(docker images -qa -f 'dangling=true')"

然后在shell中运行 docker_rmi_dangling.

(灵感来源于这篇评论)


6
无法覆盖具有相同名称的docker镜像(在“name:tag”格式中),但是如果您为镜像“my-image:latest”设置标签“my-label”,则可以在构建后自动删除该镜像。
docker build --tag my-image:latest --label my-label ubuntu:latest
docker image prune --force --filter='label=my-label'
更新: 必须按照严格的顺序执行以下步骤:
  1. docker build ...
  2. docker image prune ..
  3. docker build ...
  4. docker image prune ..

如果您执行以下步骤:

  1. docker build ...

  2. docker image prune ..

  3. docker build ...

  4. docker build ...

  5. docker image prune ..

您将会得到从第三步开始的镜像,并且不会被删除。


1
当使用与旧图像相同的标签时,此方法无法正常工作。旧图像将成为一个不可删除的父级图像。 - burny
您应该遵循严格的顺序:
  1. docker build ...
  2. docker image prune ..
  3. docker build ...
  4. docker image prune ..
如果您执行以下操作:
  1. docker build ...
  2. docker image prune ..
  3. docker build ...
  4. docker build ...
  5. docker image prune ..
则您将得到从步骤3生成的镜像未被删除的结果。 已更新我的答案。
- Vitalii Blagodir

3
如果基础镜像相同,则现有镜像将被覆盖。
否则,使用与现有镜像相同的名称构建新的docker镜像不会删除或覆盖现有镜像。它将从现有镜像中删除相同(名称)标签,并创建一个具有该名称的新镜像。
旧/现有镜像将没有标签。它将显示为。
您可以在创建具有相同名称的镜像之前重命名现有镜像,方法如下:
docker tag oldNameTag newNameTag

您可以使用以下命令删除标记为<none>的镜像。它将删除所有悬空的镜像。
docker image prune

或者

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

更多细节可以在这里找到。


3
您可以在标签中使用版本,例如:

e/g/:

docker build -t <USER>/<CONTAINER>:<VERSION>   
docker build -t maluuba/haproxy:2
docker build -t maluuba/haproxy:latest  #Default behavior when you don't use version
docker build -t maluuba/haproxy:old

1

删除所有容器和镜像的两个快捷别名。

#Containers
$ alias rmdockerall="docker rm $(docker ps -a -q)"
#Images
$ alias rmidockerall="docker rmi $(docker images -a -q)"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接