【问题标题】:Docker image retag for build promotion用于构建升级的 Docker 映像重新标记
【发布时间】:2020-03-03 20:21:03
【问题描述】:

我正在尝试使用 Jenkins docker 插件在我的 Jenkins 管道中推广 docker 映像,但我能够这样做,因为我遇到了以下错误。

"docker tag" requires exactly 2 arguments.
See 'docker tag --help'.

Usage:  docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

我可以在日志中看到以下内容

docker tag artifactory.mycompany.com/docker-dev/appname/dev:latest artifactory.mycompany.com/docker-dev/appname/dev:artifactory.mycompany.com/docker-dev/appname/dev:latest artifactory.mycompany.com/docker-dev/appname/test:latest

管道代码:

testImage = docker.image("artifactory.mycompany.com/docker-dev/appname/dev:latest")

testImage.pull()

testImage.push("artifactory.mycompany.com/docker-dev/appname/dev:latest artifactory.mycompany.com/docker-dev/appname/test:latest" )

知道这里出了什么问题...

编辑#1: 如果我遵循我会得到不同的错误。

testImage = docker.image("artifactory.mycompany.com/docker-dev/appname/dev:latest")

testImage.pull()

testImage.tag("artifactory.mycompany.com/docker-dev/appname/test:latest")

testImage.push( )

错误:

Error parsing reference: "artifactory.mycompany.com/docker-dev/appnamee/dev:artifactory.mycompany.com/docker-dev/appname/test:latest" is not a valid repository/tag: invalid reference format

【问题讨论】:

    标签: jenkins-pipeline jenkins-plugins jenkins-docker


    【解决方案1】:

    您似乎对每个 docker 命令的作用以及如何向工作区中的现有 docker 添加新标签感到困惑。

    在 Jenkins 世界中,docker commands behave like this

    docker.image 接受一个参数,组成IMAGE_NAME:TAG

    docker.tag 带有单个参数,将假定 TAG(此命令不会更改 'IMAGE_NAME',它只会更改 TAG 部分)

    docker.push 采用单个可选参数TAG,意味着只推送具有不同标签的现有图像(而不是不同的IMAGE_NAME

    在您的管道上,您正在尝试更改 docker 标识符的 IMAGE_NAME 部分,因为上述命令都没有帮助您。

    新解决方案

    解决此问题的另一种方法是通过 shell 更改 IMAGE_NAME,然后使用 Jenkins 插件映射和推送图像

    sh("docker tag ORIGINAL_IMAGE_NAME:ORIGINAL_TAG NEW_IMAGE_NAME:NEW_TAG")
    newImage = docker.image("NEW_IMAGE_NAME:NEW_TAG")
    # docker plugin should find the image on the localhost, so there is no need to pull it form the registry
    newImage.push
    

    在你的代码上,比如

    sh ('docker tag artifactory.mycompany.com/docker-dev/appname/dev:latest artifactory.mycompany.com/docker-dev/appname/test:latest')
    testImage2 = docker.image('artifactory.mycompany.com/docker-dev/appname/test:latest')
    

    然后,独立地推送每个图像

    testImage.push()
    testImage2.push()
    

    没有工作

    您可以尝试为 docker.tag 提供 2 个参数,例如

    docker.tag (ORIGINAL_IMAGE_NAME:ORIGINAL_TAG, NEW_IMAGE_NAME:NEW_TAG)
    

    在你的情况下,类似

    testImage.tag ("artifactory.mycompany.com/docker-dev/appname/dev:latest" "artifactory.mycompany.com/docker-dev/appname/test:latest")
    

    然后,独立地推送每个图像

    testImage.push (ORIGINAL_IMAGE_NAME:ORIGINAL_TAG)
    testImage.push (NEW_IMAGE_NAME:NEW_TAG)
    

    【讨论】:

    • 感谢 matus,testImage.tag("ORIG_IMG:latest" "NEW_IMG:latest") 产生错误意外令牌: ...:latest" "... 如果我这样做 testImage.tag(" ORIG_IMG:latest " + " NEW_IMG:latest") 然后我得到错误 "docker tag" 需要 2 个参数。请参阅“泊坞窗标签 --help”。用法:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 创建一个引用 SOURCE_IMAGE 的标签 TARGET_IMAGE。在日志中,我看到了与问题相同的第一个错误
    • 我认为 docker 插件标签选项将提供的值视为现有图像名称的标签,而不是将其视为带有标签的完整图像名称。这种行为似乎与 docker tag 的工作方式不同......你可以尝试它来复制行为
    • @Nikhil Gupta,我用另一种解决方案更新了答案,我相信它可能会更好
    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2016-02-02
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多