我有一个 Dockerfile,可以在 GitLab CI/CD 管道中使用 kaniko 构建它。 目前,
build
阶段都构建容器并将其推送到远程 Docker 存储库。
我想利用 CI/CD 管道的阶段概念来构建映像,然后执行自动测试并运行容器安全分析工具(Trivy),然后作为最后一步,如果之前的所有步骤都成功,我想将它推送到注册表:
构建和推送镜像的命令是:
build:latest-master:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --cache=true --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:latest
only:
- master
--no-push
执行不推送,并且有一个标志 --tar-path
只生成图像的 tarball。
我如何组合这些标志和命令来创建图像而不将其推送到注册表,因为只有在执行了安全检查后才应将其推送到注册表。 然后推送阶段(GitLab CI 作业)是什么样子的,尤其是确切的 kaniko 命令行。
如果最后一个推送阶段/作业可以重用之前构建的图像或缓存而不是再次重建它,那就太好了。 我想 tarball 可以以某种方式使用,但是 kaniko 使用它的标志是什么?或者我只是使用该 tarball 并使用 docker 命令将 tarball 推送到注册表?
您可以使用 crane 工具来做到这一点:
docker:build:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug-v1.0.0
entrypoint: [""]
script:
- /kaniko/executor
--context $CI_PROJECT_DIR
--dockerfile $CI_PROJECT_DIR/docker/Dockerfile
--no-push
--destination $CI_REGISTRY_IMAGE/path/to/your/image:version
--tar-path image.tar
artifacts:
paths:
- image.tar
when: on_success
docker:push:
stage: push
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: [""]
script:
- crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- crane push image.tar $CI_REGISTRY_IMAGE/path/to/your/image:version
needs:
- docker:build
如果您需要推送到 ECR 那么您可以使用以下
stages:
- build
- push
variables:
APP_NAME: my_app
IMAGE_TAG_COMMIT: $APP_NAME:$CI_COMMIT_SHORT_SHA
ECR_REPOSITORY_URI: $ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
kaniko-build:
stage: build
image:
name: gcr.io/kaniko-project/executor:v1.19.2-debug
entrypoint: [""]
before_script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
script:
- /kaniko/executor
--context "${CI_PROJECT_DIR}"
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination $IMAGE_TAG_COMMIT
--tar-path $APP_NAME.tar
--no-push
artifacts:
paths:
- $APP_NAME.tar
when: on_success
expire_in: 1 week
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
aws-login-dev:
stage: push
environment: dev
image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
script:
- echo "Get AWS login password"
- echo "ECR_REGISTRY_PASSWORD=$(aws ecr get-login-password --region $AWS_DEFAULT_REGION)" >> aws.dev.env
artifacts:
reports:
dotenv: aws.dev.env
crane-push-dev:
stage: push
environment: dev
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: [""]
script:
- crane auth login -u AWS -p $ECR_REGISTRY_PASSWORD $ECR_REPOSITORY_URI
- crane push $APP_NAME.tar $ECR_REPOSITORY_URI/$IMAGE_TAG_COMMIT
needs:
- job: aws-login-dev
artifacts: true
- job: kaniko-build
artifacts: true