如何在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
- Nexus Docker仓库的用户名+密码凭据,凭据ID记为
- 目标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
相关产品推荐
相关产品推荐

