You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线Docker代理多私有镜像仓库登录问题求助

解决方案:Jenkins流水线TestContainers访问多个私有Docker仓库认证问题

核心问题分析

TestContainers通过挂载的/var/run/docker.sock调用Jenkins代理节点的Docker服务,因此需要代理节点的Docker客户端拥有两个私有仓库的认证信息,而非maven容器内的Docker配置。

可行方案

方案1:在Jenkins代理节点预先完成双仓库登录

调整流水线结构,先在代理节点执行两个仓库的登录,再启动maven容器:

pipeline {
    agent none
    stages {
        stage('双仓库Docker登录') {
            agent { label 'docker-enabled-agent' } // 指定你的Docker代理节点标签
            steps {
                script {
                    // 登录第一个私有仓库
                    docker.withRegistry('https://docker_custom_registry_1', 'custom-credential-1') {}
                    // 登录第二个私有仓库
                    docker.withRegistry('https://docker_custom_registry_2', 'custom-credential-2') {}
                }
            }
        }
        stage('构建与测试') {
            agent {
                docker {
                    registryUrl 'https://docker_custom_registry_1'
                    registryCredentialsId 'custom-credential-1'
                    image 'docker_custom_registry_1/mvn-3.5.4-jdk:latest'
                    args '-v /u01/jenkins/m2-repo:/m2-repo -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock'
                }
            }
            stages {
                stage("初始化") {
                    steps {
                        script {
                            // 你的初始化逻辑
                        }
                    }
                }
                stage("构建") {
                    steps {
                        script {
                            sh 'mvn clean install'
                        }
                    }
                }
            }
        }
    }
}

说明:docker.withRegistry会在代理节点执行登录,认证信息存储在节点的~/.docker/config.json中,TestContainers调用代理节点Docker时自动读取该配置。

方案2:在maven容器内完成双仓库登录(需挂载Docker配置目录)

修改agent参数,挂载代理节点的Docker配置目录到容器,确保容器内有Docker客户端,然后执行登录:

pipeline {
    agent {
        docker {
            registryUrl 'https://docker_custom_registry_1'
            registryCredentialsId 'custom-credential-1'
            image 'docker_custom_registry_1/mvn-3.5.4-jdk:latest'
            args '-v /u01/jenkins/m2-repo:/m2-repo -v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/.docker:/root/.docker'
        }
    }
    stages {
        stage("Docker双仓库登录") {
            steps {
                script {
                    // 确保容器内有Docker客户端(根据镜像基础系统调整)
                    sh 'apt-get update && apt-get install -y docker.io'
                    // 登录第二个私有仓库
                    withCredentials([usernamePassword(credentialsId: 'custom-credential-2', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) {
                        sh "docker login https://docker_custom_registry_2 -u ${REG_USER} -p ${REG_PASS}"
                    }
                }
            }
        }
        stage("初始化") {
            steps {
                script {
                    // 你的初始化逻辑
                }
            }
        }
        stage("构建") {
            steps {
                script {
                    sh 'mvn clean install'
                }
            }
        }
    }
}

说明:挂载$HOME/.docker:/root/.docker后,容器内执行的docker login会直接修改代理节点的Docker配置,TestContainers可直接使用。

方案3:让TestContainers直接使用凭证访问私有仓库

无需依赖Docker节点的登录状态,通过TestContainers的配置或代码注入凭证:

方式A:通过maven参数传递

在流水线中注入凭证,通过maven命令行参数传递给TestContainers:

// 在Build阶段修改为:
stage("构建") {
    steps {
        script {
            withCredentials([usernamePassword(credentialsId: 'custom-credential-2', usernameVariable: 'REG_USER', passwordVariable: 'REG_PASS')]) {
                sh 'mvn clean install -Dtestcontainers.docker.client.registry.username=${REG_USER} -Dtestcontainers.docker.client.registry.password=${REG_PASS} -Dtestcontainers.docker.client.registry.url=https://docker_custom_registry_2'
            }
        }
    }
}

方式B:代码中配置凭证

在测试代码中直接指定私有仓库凭证:

import org.testcontainers.DockerClientFactory;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.core.DefaultDockerClientConfig;

// 在测试初始化方法中添加:
DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
        .withRegistryUrl("https://docker_custom_registry_2")
        .withRegistryUsername("你的用户名")
        .withRegistryPassword("你的密码")
        .build();
DockerClient dockerClient = DockerClientFactory.getInstance().client(config);

说明:该方案更灵活,不会在代理节点留下持久化的登录信息,适合多环境或临时凭证场景。

内容的提问来源于stack exchange,提问作者DJ-Glock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:02:56