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

如何在Jenkins pipeline中将Nexus docker仓库镜像复制到AWS ECR

Jenkins Pipeline实现Nexus Docker镜像到AWS ECR迁移方案

前置准备

  • Jenkins执行节点已预装docker、aws-cli工具,且运行Jenkins进程的用户有权限执行Docker命令
  • 已在Jenkins凭据管理中存储两类凭据:
    • Nexus Docker仓库的用户名+密码凭据,凭据ID记为nexus-docker-creds
    • 具备ECR读写权限的AWS IAM凭据,凭据ID记为aws-ecr-creds
  • 目标AWS ECR仓库已提前创建,或已开启ECR自动创建仓库的权限

可直接使用的Pipeline示例

请将environment块中的域名、账号ID、区域、镜像列表等配置替换为你自己的实际值

pipeline {
    agent any
    environment {
        // Nexus Docker仓库地址
        NEXUS_REGISTRY = "your-nexus-repo.com"
        // AWS ECR仓库地址,格式为【AWS账号ID.dkr.ecr.区域.amazonaws.com】
        ECR_REGISTRY = "123456789012.dkr.ecr.us-east-1.amazonaws.com"
        // AWS区域
        AWS_REGION = "us-east-1"
        // 待迁移镜像列表,格式为 镜像路径:标签
        IMAGE_LIST = """
        business/order-service:v1.3.0
        business/user-service:v2.1.2
        middleware/redis:7.0-alpine
        middleware/nginx:1.24.0
        """.trim().split('\n')
    }
    stages {
        stage('登录镜像仓库') {
            steps {
                script {
                    // 登录Nexus仓库
                    withCredentials([usernamePassword(credentialsId: 'nexus-docker-creds', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PWD')]) {
                        sh "docker login ${NEXUS_REGISTRY} -u ${NEXUS_USER} -p ${NEXUS_PWD}"
                    }
                    // 登录AWS ECR
                    withCredentials([usernamePassword(credentialsId: 'aws-ecr-creds', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY')]) {
                        sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REGISTRY}"
                    }
                }
            }
        }
        stage('批量迁移镜像') {
            steps {
                script {
                    IMAGE_LIST.each { imageTag ->
                        echo "开始迁移镜像:${imageTag}"
                        // 从Nexus拉取镜像
                        sh "docker pull ${NEXUS_REGISTRY}/${imageTag}"
                        // 为镜像打ECR格式的新标签
                        sh "docker tag ${NEXUS_REGISTRY}/${imageTag} ${ECR_REGISTRY}/${imageTag}"
                        // 推送镜像到ECR
                        sh "docker push ${ECR_REGISTRY}/${imageTag}"
                        // 清理本地镜像,释放节点存储空间
                        sh "docker rmi ${NEXUS_REGISTRY}/${imageTag} ${ECR_REGISTRY}/${imageTag}"
                        echo "镜像${imageTag}迁移完成"
                    }
                }
            }
        }
    }
    post {
        always {
            // 清除节点上的仓库登录信息,避免泄露
            sh "docker logout ${NEXUS_REGISTRY}"
            sh "docker logout ${ECR_REGISTRY}"
        }
    }
}

优化建议

  • 如需全量迁移Nexus上的所有镜像,可调用Nexus的公开API拉取所有镜像的名称和标签,自动生成IMAGE_LIST,无需手动维护列表
  • 大镜像批量迁移时,可将each遍历改为parallel并发逻辑,大幅提升迁移效率;也可给docker命令添加--quiet参数减少冗余日志输出
  • 对数据一致性要求高的场景,可在推送完成后添加校验步骤,比对Nexus和ECR两端镜像的sha256哈希值,避免传输过程中出现数据损坏
  • 若Nexus仓库使用自签名证书,需提前将根证书导入Jenkins执行节点的Docker信任证书目录,避免拉取镜像时出现证书不信任报错

内容的提问来源于stack exchange,提问作者Vikas R Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:03