13

我有一个 Dockerfile,我可以在 GitLab CI/CD 管道中使用 kaniko 构建它。目前,buildstage既构建了 Container,又将其推送到了远程 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 Job)是什么样子的,尤其是确切的 kaniko 命令行。

如果最后一个推送阶段/作业可以重用先前构建的图像或缓存并且不再重新构建它,那就太好了。 我想 tarball 可以以某种方式使用,但是 kaniko 使用它的标志是什么?还是我只是使用该 tarball 并使用 docker 命令将 tarball 推送到注册表?

4

1 回答 1

26

您可以使用起重机工具来做到这一点:

  • 第一步:使用 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
    --tarPath 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
于 2020-08-19T17:09:45.610 回答