kaniko と GitLab CI/CD によるイメージのビルド

GitLab 11.2で導入されました。GitLab Runner 11.2以降が必要です。

kanikoはコンテナやKubernetesクラスタ内でDockerファイルからコンテナイメージを構築するツールです。

kanikoはDocker-in-Dockerのビルド方法を使用する際の2つの問題を解決します:

  • Docker-in-Dockerを機能させるためには特権モードが必要であり、これはセキュリティ上の重大な問題です。
  • Docker-in-Dockerは一般的にパフォーマンス・ペナルティが発生し、かなり遅くなる可能性があります。

要件

GitLabでkanikoを利用するには、以下のいずれかのexecutorを使用したGitLab Runnerが必要です:

kanikoによるDockerイメージの構築

kanikoとGitLab CI/CDを使ってイメージをビルドする際には、いくつかの重要な点に注意する必要があります:

  • kanikoのデバッグイメージが推奨されています(gcr.io/kaniko-project/executor:debug)。これはCI/CDでGitLabのイメージを使うにはシェルが必要だからです。
  • エントリーポイントをオーバーライドしないと、ビルドスクリプトは実行されません。
  • 目的のコンテナレジストリの認証情報を含む Dockerconfig.json ファイルを作成する必要があります。

次の例では、kanikoを使用しています:

  1. Dockerイメージをビルドします。
  2. その後、GitLabコンテナレジストリにプッシュします。

ジョブはタグがプッシュされた時だけ実行されます。/kaniko/.docker の下に、GitLab CI/CD が提供する環境変数から取得した必要な GitLab コンテナレジストリの認証情報でconfig.json ファイルが作成されます。

最後のステップで、kanikoはプロジェクトのルートディレクトリ下のDockerfile 、Dockerイメージをビルドし、Gitタグを付けながらプロジェクトのコンテナレジストリにプッシュします:

build:
  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 --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
  only:
    - tags

カスタム証明書でのレジストリの使用

カスタムCAによって署名された証明書を使用しているDockerレジストリにプッシュしようとすると、以下のエラーが発生することがあります:

$ /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --no-push
INFO[0000] Downloading base image registry.gitlab.example.com/group/docker-image
error building image: getting stage builder for stage 0: Get https://registry.gitlab.example.com/v2/: x509: certificate signed by unknown authority

これは、あなたのCAの証明書をkaniko証明書ストアに追加することで解決できます:

  before_script:
    - mkdir -p /kaniko/.docker
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - |
      echo "-----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----" >> /kaniko/ssl/certs/ca-certificates.crt

動作例のビデオ・ウォークスルー

TheLeast Privilege Container Builds with Kaniko onGitLab videoはKaniko Docker BuildGuided Explorationプロジェクトパイプラインのウォークスルーです。 これはGitLabでテストされました:

このサンプルは、自分のグループやインスタンスにコピーしてテストすることができます。 他のGitLab CIパターンがどのようにデモされているかの詳細は、プロジェクトページで確認できます。