【问题标题】:Is it possible for image to have multiple tags?图像可以有多个标签吗?
【发布时间】:2015-11-04 23:06:25
【问题描述】:

当我将新图像推送到 repo 时,我希望它有两个标签,例如 0.2latest。例如,这将允许始终使用latest 标记和使用0.2 标记的特定版本来提取最新的图像版本。 docker可以吗?

有什么解决方法吗?我看到的唯一解决方案是进行两次单独的推送...

【问题讨论】:

    标签: docker dockerhub


    【解决方案1】:

    您可以使用多个标签构建图像,然后使用--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 reg/user/image 中的“reg”用于标识目标注册表。 (Docker Hub 的注册表是docker.io,默认命名空间称为library。因此,如果您拉取或推送一个名为“foo”的映像,它会隐含地将其标识为docker.io/library/foo。) – 使用registry.your-domain.com/your-namespace/your-image,即应该管用。这假设 CLI。
    • 请注意,在 Docker 20.03 中,此代码将仅推送 reg/user/image:latest不是所有标签。当前的行为,即在 docker push 中省略标签时推送所有标签时未记录并被认为令人困惑,因此现在是 fixed 尽管您仍然可以通过添加 -a/--all-tags 标志来推送 20.03 中的所有标签
    【解决方案2】:

    您可以创建多个标签:

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

    然后推送这些。

    【讨论】:

    • 从 Docker 1.10 开始你也可以这样做:docker build -t &lt;user&gt;/&lt;image&gt;:0.2 -t &lt;user&gt;/&lt;image&gt;:latest .
    • 是否需要为每个标签推送才能推送每个标签,还是可以只推送一个标签?
    • @Wmbuch @EdRandall as of Docker version 18.06.1-ce, build e68fc7a 我不得不独立推送 each 标签,即使它们在本地指向相同的图像 ID。第一个之后的推送显然是每一层的“层存在”,因此它们本身不传输任何数据,但无论如何都必须执行。
    • 你试过没有标签的docker push user/repository吗?我认为这会推动每个标签。
    • @Adirio 此行为已更改,无标签推送不再推送 all 标签,请参阅github.com/docker/cli/pull/2220
    【解决方案3】:

    您需要为每个版本执行一次推送,例如:

    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
    

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

    【讨论】:

    • NO,如果不推送最新标签。您无法在注册表中找到。你试过了吗?
    【解决方案4】:

    更新:2021 年 1 月之前

    如果你没有在 push 命令中指定标签,它会推送所有的标签。

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

    【讨论】:

    【解决方案5】:

    在一张图片上有多个标签是有正当理由的(请参阅 OP),但如果您想添加标签以提供信息,最好使用 图片标签

    Docker 标签在内部镜像,而不是在注册表中应用到它。这意味着标签是不可变的,并且总是与图像一起复制。

    Label Schemaversionvcs-refbuild-date 等对象定义了一个可互操作标签列表。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 2020-04-06
        • 2015-04-24
        • 1970-01-01
        • 2014-03-16
        • 2011-02-07
        • 1970-01-01
        相关资源
        最近更新 更多