【发布时间】:2015-11-04 23:06:25
【问题描述】:
当我将新图像推送到 repo 时,我希望它有两个标签,例如 0.2 和 latest。例如,这将允许始终使用latest 标记和使用0.2 标记的特定版本来提取最新的图像版本。 docker可以吗?
有什么解决方法吗?我看到的唯一解决方案是进行两次单独的推送...
【问题讨论】:
当我将新图像推送到 repo 时,我希望它有两个标签,例如 0.2 和 latest。例如,这将允许始终使用latest 标记和使用0.2 标记的特定版本来提取最新的图像版本。 docker可以吗?
有什么解决方法吗?我看到的唯一解决方案是进行两次单独的推送...
【问题讨论】:
您可以使用多个标签构建图像,然后使用--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。作为替代方案,您可能希望单独推送每个标签。
【讨论】:
reg/user/image 中的“reg”用于标识目标注册表。 (Docker Hub 的注册表是docker.io,默认命名空间称为library。因此,如果您拉取或推送一个名为“foo”的映像,它会隐含地将其标识为docker.io/library/foo。) – 使用registry.your-domain.com/your-namespace/your-image,即应该管用。这假设 CLI。
reg/user/image:latest,不是所有标签。当前的行为,即在 docker push 中省略标签时推送所有标签时未记录并被认为令人困惑,因此现在是 fixed 尽管您仍然可以通过添加 -a/--all-tags 标志来推送 20.03 中的所有标签
您可以创建多个标签:
docker tag <id> <user>/<image>:0.2
docker tag <id> <user>/<image>:latest
然后推送这些。
【讨论】:
docker build -t <user>/<image>:0.2 -t <user>/<image>:latest .
Docker version 18.06.1-ce, build e68fc7a 我不得不独立推送 each 标签,即使它们在本地指向相同的图像 ID。第一个之后的推送显然是每一层的“层存在”,因此它们本身不传输任何数据,但无论如何都必须执行。
docker push user/repository吗?我认为这会推动每个标签。
您需要为每个版本执行一次推送,例如:
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
你也可以结合起来说latest的版本是0.2 like:
docker tag <repo>/<user>/test:latest <repo>/<user>/test:0.2
docker push <repo>/<user>/test:0.2
所以它们将指向同一个图像层。
【讨论】:
更新:2021 年 1 月之前
如果你没有在 push 命令中指定标签,它会推送所有的标签。
docker tag user/imagename:tag1
docker tag user/imagename:tag2
docker push user/imagename
【讨论】:
在一张图片上有多个标签是有正当理由的(请参阅 OP),但如果您想添加标签以提供信息,最好使用 图片标签。
Docker 标签在内部镜像,而不是在注册表中应用到它。这意味着标签是不可变的,并且总是与图像一起复制。
Label Schema 为version、vcs-ref、build-date 等对象定义了一个可互操作标签列表。
【讨论】:
如果您不想通过哈希引用图像,而是“复制标签”,您可以执行以下操作:
docker tag image:origin_tag image:target_tag
docker push image:target_tag
【讨论】: