图片是否可以拥有多个标签?

123
当我将新镜像推送到仓库时,我希望它具有两个标签,例如0.2latest。这将允许您始终使用latest标签拉取最新的镜像版本,并使用0.2标签获取特定的版本,例如。Docker是否支持这种方式?
是否有任何解决方法? 我所看到的唯一解决方案是进行两次独立的推送...
6个回答

252
你可以用多个标签构建一个镜像,然后使用--all-tags选项推送该镜像。
例如:
docker build -t reg/user/image:foo -t reg/user/image:latest .

docker push reg/user/image --all-tags

不支持--all-tags的旧版Docker客户端会默认推送所有标签(只需省略该选项),新版客户端默认仅推送latest标签。作为替代方案,您可能希望单独推送每个标签。


看起来推送本地镜像名称假定为DockerHub - 我正在使用Docker桌面版,所以我必须逐个推送每个标签。有没有一种方法可以设置目标注册表/仓库? - badcop666
2
@badcop666 reg/user/image 中的 "reg" 是用来标识目标注册表的。 (Docker Hub 的注册表是 docker.io,默认命名空间称为 library。因此,如果您拉取或推送名为 "foo" 的镜像,则会隐式地将其标识为 docker.io/library/foo。) - 使用 registry.your-domain.com/your-namespace/your-image,应该可以解决问题。这假定使用 CLI。 - Peterino
应该是被接受的答案。当前被接受的答案没有解释如何进行推送。是一个推送?还是两个? - Roee Gavirel
5
请注意,在 Docker 20.03 中,此代码仅会推送 reg/user/image:latest 标签,而非所有标签。当前行为,在 docker push 命令中省略标签时自动推送所有标签,这是未记录并且容易引起困惑的,因此已经进行了修复。尽管如此,在 20.03 版本中您仍然可以通过添加 -a/--all-tags 标志来推送所有标签。 - Ed'ka
--all-tags 标志完成了它。谢谢。 - DevNik
这并不是一个很好的解决方案。如果你在本地构建了很长时间,可能会有300个本地标签,但最新构建的可能只有2个标签(“latest”和版本号)。如果使用“--all-tags”,它会尝试将所有标签都推送上去。实际上需要的是一个仅推送刚刚构建的2个标签而不是你全部历史记录中的300个标签的解决方案。 - Stephen

78

您可以创建多个标签:

docker tag <id> <user>/<image>:0.2
docker tag <id> <user>/<image>:latest

并推动这些。


65
从 Docker 1.10 版本开始,您还可以执行以下操作:docker build -t <user>/<image>:0.2 -t <user>/<image>:latest . - ZoidbergWill
19
每个标签都需要推送时是否需要为每个标签推送,还是只需要一个标签就能推送? - Mike S
4
截至“Docker version 18.06.1-ce, build e68fc7a”,即使本地标签指向相同的镜像ID,我仍需独立推送每个标签。显然,在第一次推送之后,每个层都会出现“层已存在”的提示,因此它们并不传输任何数据,但仍需执行。 - illegal-immigrant
13
你尝试过不带标签docker push user/repository吗?我认为这会推送所有标签。 - Adirio
5
@Adirio,这种行为已经改变了,不带标签推送将不再推送所有标签,请参见https://github.com/docker/cli/pull/2220。 - jtschoonhoven
显示剩余2条评论

35

你需要对每个版本进行一次推送,例如:

docker tag test:latest <repo>/<user>/test:latest
docker push <repo>/<user>/test:latest

docker tag test:0.2 <repo>/<user>/test:0.2
docker push <repo>/<user>/test:0.2

您也可以结合使用,例如说最新版本为0.2

docker tag <repo>/<user>/test:latest <repo>/<user>/test:0.2
docker push <repo>/<user>/test:0.2

所以它们将指向同一个图像层。


5
不,如果没有推送最新标签,您将无法在注册表中找到它。您尝试过了吗? - alparslan

22

更新:2021年1月之前

如果您在推送命令中未指定标签,则会将所有标签都推送。

docker tag user/imagename:tag1
docker tag user/imagename:tag2

docker push user/imagename

6
警告:根据2021年1月的最新信息,似乎不再适用。 https://github.com/docker/cli/pull/2220 - jtschoonhoven

1

图片上有多个标签是有合理的原因的(请参见 OP),但如果您想添加信息用途的标签,最好使用图像标签

Docker 标签位于镜像内部,而不是应用于注册表中的镜像。这意味着标签是不可变的,并且始终随镜像一起复制。

标签模式 定义了一系列可互操作的标签,例如versionvcs-refbuild-date等。


1

如果您不想通过哈希引用图像,而是“复制标签”,可以执行以下操作:

docker tag image:origin_tag image:target_tag
docker push image:target_tag

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