如何在GitLab CI中用Kaniko推送已有镜像tar包至AWS ECR?
解决方案:GitLab CI中Kaniko构建镜像后扫描并推送AWS ECR的无额外安装方案
可行,以下是几个无需大型安装或自定义镜像的解决方案:
方案一:用Kaniko通过临时Dockerfile导入tar包并推送
Kaniko本身没有直接推送本地tar包的参数,但可以通过编写极简临时Dockerfile来导入已生成的tar包,再完成推送,全程无需重新构建原镜像:
- 构建镜像并导出tar包的阶段:
build-image: stage: build image: gcr.io/kaniko-project/executor:debug script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --tarPath image.tar --no-push artifacts: paths: - image.tar
- Trivy扫描阶段:
scan-image: stage: scan image: aquasec/trivy:latest script: - trivy image --input image.tar --severity HIGH,CRITICAL dependencies: - build-image
- 推送镜像到ECR的阶段:
push-to-ecr: stage: deploy image: gcr.io/kaniko-project/executor:debug script: # 编写临时Dockerfile导入tar包 - echo "FROM scratch" > Dockerfile.ecr - echo "ADD image.tar /" >> Dockerfile.ecr # 配置ECR认证 - AWS_AUTH=$(aws ecr get-login-password --region $AWS_REGION) - echo "{\"auths\":{\"$AWS_ECR_REPO\":{\"username\":\"AWS\",\"password\":\"$AWS_AUTH\"}}}" > /kaniko/.docker/config.json # 用Kaniko构建临时Dockerfile并推送 - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile.ecr --destination $AWS_ECR_REPO:$CI_COMMIT_SHA dependencies: - build-image variables: AWS_REGION: "your-region" AWS_ECR_REPO: "123456789012.dkr.ecr.your-region.amazonaws.com/your-repo"
这个方案全程用官方Kaniko镜像,不需要额外安装工具,只是通过临时Dockerfile把tar包导入成镜像再推送,本质是镜像的导入操作,速度极快,不会重复构建原镜像。
方案二:用GitLab CI内置AWS CLI配置crane登录,绕过credHelper
如果坚持用crane推送,不需要安装credHelper,直接用AWS CLI获取ECR登录密码,手动完成crane的登录:
- 确保GitLab CI runner已配置AWS权限(或通过变量传入
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY) - 推送阶段的配置:
push-with-crane: stage: deploy image: gcr.io/go-containerregistry/crane:latest script: # 获取ECR登录密码并完成crane登录 - aws ecr get-login-password --region $AWS_REGION | crane login -u AWS --password-stdin $AWS_ECR_REPO # 推送本地tar包到ECR - crane push image.tar $AWS_ECR_REPO:$CI_COMMIT_SHA dependencies: - build-image variables: AWS_REGION: "your-region" AWS_ECR_REPO: "123456789012.dkr.ecr.your-region.amazonaws.com/your-repo" AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
注意:部分crane镜像可能未预装AWS CLI,此时可以用包含AWS CLI的镜像(比如amazon/aws-cli:latest),先下载crane二进制(轻量操作,不算大型安装):
push-with-crane: stage: deploy image: amazon/aws-cli:latest script: # 下载crane二进制 - curl -L https://github.com/google/go-containerregistry/releases/download/v0.16.1/go-containerregistry_Linux_x86_64.tar.gz | tar xzf - crane - chmod +x crane # 登录并推送 - aws ecr get-login-password --region $AWS_REGION | ./crane login -u AWS --password-stdin $AWS_ECR_REPO - ./crane push image.tar $AWS_ECR_REPO:$CI_COMMIT_SHA dependencies: - build-image
这种方式不需要credHelper,直接通过密码完成登录,避免了credHelper的配置问题,且下载crane二进制属于轻量操作,符合你的需求。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

