如何从一个私有注册表中提取 Docker 映像并将其推送到 Jenkins 管道中的第二个不同的私有注册表

vzs*_*shi 2 jenkins docker jenkins-pipeline

我能够从 Jenkins 连接到两个私有注册表,我可以拉出我想要的图像,但是我不知道如何将相同的图像推送到不同的存储库。

请注意,我使用的是脚本化管道语法,因为据我所知,声明性语法不支持推/拉或自定义注册表。我也不熟悉 Groovy 语法。

这是我的 Jenkinsfile 到目前为止的内容:

node {
    checkout scm

    docker.withRegistry('https://private-registry-1', 'credentials-1') {
        def image = docker.image('my-image:tag')
        image.pull()

        docker.withRegistry('https://private-registry-2', 'credentials-2') {
            image.push()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我将第二个“withRegistry()”方法放在第一个方法中,以便我可以使用定义的“image”变量。

我成功连接到第一个注册表并拉取最新的镜像。从詹金斯控制台输出:

Login Succeeded
[Pipeline] {
[Pipeline] sh
+ docker pull private-registry-1/my-image:tag
tag: Pulling from my-image
Digest: sha256:XXXXX
Status: Image is up to date for private-registry-1/my-image:tag
Run Code Online (Sandbox Code Playgroud)

但是,这是连接到第二个注册表后的相关错误片段:

...
Login Succeeded
[Pipeline] {
[Pipeline] sh
+ docker tag my-image:tag private-registry-2/my-image:tag
Error response from daemon: No such image: my-image:tag
...
Run Code Online (Sandbox Code Playgroud)

我在本地 Windows 机器上使用 Jenkins 容器。它通过我的 Ubuntu 终端(Linux 的 Windows 子系统)连接到 Docker for Windows。

vzs*_*shi 8

解决方案是在推送之前标记图像,最终代码:

node {
    checkout scm

    stage 'Pull latest image from private-registry-1'

    def image
    docker.withRegistry('https://private-registry-1', 'credentials-1') {
        image = docker.image('my-image:tag')
        image.pull()
    }

    stage 'Push image to private-registry-2'

    // SOLUTION START
    sh 'docker tag private-registry-1/my-image:tag private-registry-2/my-image:tag'
    image = docker.image('private-registry-2/my-image:tag')
    // SOLUTION END

    docker.withRegistry('https://private-registry-2', 'credentials-2') {
        image.push()
    }
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢如何通过“sh”手动完成标记,但我找不到通过内置 Docker 语法来完成的方法。我还需要参数化图像名称和标签 (my-image:tag) 以备将来使用。