【问题标题】:Docker push: push image once with multiple tagsDocker push:使用多个标签推送一次图像
【发布时间】:2018-12-27 13:58:23
【问题描述】:

我有一个带有三个标签repo:latestrepo:v1.1repo:dev 的 docker 映像。当我执行docker push repo:v1.1 时,只会将一个标签推送到存储库中。有没有办法对所有标签进行一次推送,或者我需要按标签推送?

【问题讨论】:

    标签: docker tags push


    【解决方案1】:

    docker push 命令不接受多个参数(如果有人想一次性推送多个标签的选择(不是全部)),因此需要分别推送每个标签,例如:

    for t in latest v1.1 dev; do
        docker push "repo:${t}"
    done
    

    否则,如@GuillaumePancak's answer 中所述,人们可能有兴趣依赖--all-tags 可用的标志from Docker 20.10.0

    还要注意,经常考虑为同一图像推送 几个不同的标签(这也可能是您的用例)。在这种情况下,连续推送这些标签(而不是同时推送多个并发进程)确保标签同义词的docker push 在使用给定标签推送一次图像后几乎立即出现。

    【讨论】:

    • 为什么投反对票?如果有人想一次性推送多个标签(不是全部)的选择,docker push image:tag1 image:tag2 仍然不可用。然而,正如@GuillaumePancak 的回答所指出的那样,--all-tags CLI 选项可能很有用。也将编辑我的答案以链接到此答案。
    【解决方案2】:

    如果你想为一张图片推送所有标签,你可以使用--all-tags选项:

    docker image push --all-tags repository/image_name
    

    Docker 20.10 and newer 支持此选项。可以通过在旧版本上省略 --all-tags 来实现相同的行为。


    更多信息:Docker push documentation

    【讨论】:

    • 不幸的是,迁移到 Docker 20.10+ 确实会引入一个重大更改,因为只推送第一个标签,这与之前的版本相反,但是更安全地控制我们真正想做的事情
    【解决方案3】:

    我也遇到过类似的情况,可以这样解决:

    在我的示例中,我将使用 elonmusk/spacerocket 作为示例存储库名称。您应该将其替换为您的 name/repo

    # First I build and tag my image:
    docker build --tag elonmusk/spacerocket:tag-1 --tag elonmusk/spacerocket:tag-2 --tag elonmusk/spacerocket:flymetothemoon .
    

    在运行docker images 后给出此输出 (我已经从这个表中省略了 CREATED 和 SIZE)

    REPOSITORY                        TAG                IMAGE ID            
    elonmusk/spacerocket              tag-1              1a4acbyb12db        
    elonmusk/spacerocket              tag-2              1a4acbyb12db        
    elonmusk/spacerocket              flymetothemoon     1a4acbyb12db
    

    现在当我在没有任何标签的情况下执行docker push elonmusk/spacerocket 时,它会为我推送所有标签。

    我喜欢使用的其他一些方法:

    # First I build my image:
    docker build -t thiscouldbewhatever . # -t is shorthand for --tag
    

    给出这个输出:

    REPOSITORY                        TAG                IMAGE ID            
    thiscouldbewhatever               latest             1a4acbyb12db
    

    现在我开始标记:

    docker tag thiscouldbewhatever elonmusk/spacerocket:tag-1
    docker tag thiscouldbewhatever elonmusk/spacerocket:tag-2
    docker tag thiscouldbewhatever elonmusk/spacerocket:tag-3
    docker tag thiscouldbewhatever elonmusk/spacerocket:whystopatthemoon
    

    最后推送我所有的标签:

    # push the repo without using a tag.
    docker push elonmusk/spacerocket
    
    # Just to be double clear, this will only push one tag:
    docker push elonmusk/spacerocket:tag-1
    

    【讨论】:

    • 啊,是的,我确实看到这个问题已经有 2 年的历史了,但我偶然发现了它,并认为这可能会对某人有所帮助......有一天......
    【解决方案4】:

    目前有change可以同时推送多张图片,正在审核中。 但它只为docker push 添加了一个循环,而不是并行化它们。 所以目前唯一的解决方案是分别推送每个标签。

    【讨论】:

    • 你说的PR好像已经关闭了没有合并。我还找到了另一个相关的pull request(也已关闭)。因此,仍然没有任何方法可以并行推送。
    【解决方案5】:

    在脚本中,您可以执行这样的循环来推送图像的所有标签; ${1} 是传递给脚本的第一个参数;喜欢docker_push myimage

    for i in $(docker image list --format "{{.Tag}}" "${1}"); do
        docker push "${1}:$i"
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多