如何在单独的 GitLab CI 阶段中执行 kaniko Docker 构建和推送?

问题描述 投票:0回答:2

我有一个 Dockerfile,可以在 GitLab CI/CD 管道中使用 kaniko 构建它。 目前,

build
阶段都构建容器并将其推送到远程 Docker 存储库。

我想利用 CI/CD 管道的阶段概念来构建映像,然后执行自动测试并运行容器安全分析工具(Trivy),然后作为最后一步,如果之前的所有步骤都成功,我想将它推送到注册表:

  1. 建立形象
  2. 执行自动测试(基于创建的图像)
  3. 分析创建的图像的安全性(使用 Trivy)
  4. 仅当前面的步骤成功并且不重建映像时才将映像推送到注册表

构建和推送镜像的命令是:

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 推送到注册表?

docker continuous-integration gitlab-ci kaniko
2个回答
55
投票

您可以使用 crane 工具来做到这一点:

  • 第一步:使用 Kaniko 构建并导出到 tarball。将您的图像保存为工件。
  • 第二步:使用起重机将 tarball 推送到注册表
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

0
投票

如果您需要推送到 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
© www.soinside.com 2019 - 2024. All rights reserved.