GeekFactory

int128.hatenablog.com

GitLab RunnerとkanikoでDockerイメージをビルドする

DockerやKubernetesでGitLab Runnerを実行する場合,GitLab RunnerでDockerイメージをビルドするにはDocker in Dockerの特権モードを構成する必要があります.kanikoを利用すると,特権モードを使わずにDockerイメージをビルドできます.

本稿では,GitLab Runner上でkanikoを利用してDockerイメージをビルドし,Amazon ECRにDockerイメージをpushするまでの流れを紹介します. https://docs.gitlab.com/ee/ci/docker/using_kaniko.html で説明されている内容を元にしています.

ここでは,以下の前提とします.

IAM Roleの割り当て

GitLab Runner workerがECRにアクセスできるように,GitLab Runner workerのPodにIAM Roleを割り当てます.具体的な方法は下記を参照してください.

int128.hatenablog.com

.gitlab-ci.ymlの作成

kanikoを利用するには gcr.io/kaniko-project/executor イメージを指定します.イメージには amazon-ecr-credential-helper が組み込まれており,/kaniko/.docker/config.jsoncredHelpers を設定するとIAM Roleを利用してECRにアクセスできます.

.gitlab-ci.yml を以下のように設定します.

stages:
  - push

push:
  stage: push
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  variables:
    ECR_HOST: xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
  script:
    - |
      cat > /kaniko/.docker/config.json <<EOF
      {
        "credHelpers": {
          "${ECR_HOST}": "ecr-login"
        }
      }
      EOF
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $ECR_HOST/repository-name:latest
  dependencies:
    - build
  tags:
    - app

ビルドを実行した後,ECRのリポジトリにイメージが表示されると成功です.

トラブルシューティング

ECRにアクセスする権限がない場合や /kaniko/.docker/config.json が適切に設定されていない場合は以下のエラーが表示されます.

error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again: checking push permission for "xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/repository-name:latest": unsupported status code 401; body: Not Authorized

参考までに, gcr.io/kaniko-project/executor イメージの環境変数は以下に設定されています.

ENV DOCKER_CREDENTIAL_GCR_CONFIG=/kaniko/.config/gcloud/docker_credential_gcr_config.json
ENV DOCKER_CONFIG=/kaniko/.docker/
ENV SSL_CERT_DIR=/kaniko/ssl/certs
ENV PATH=/usr/local/bin:/kaniko
ENV USER=/root
ENV HOME=/root

(2019/9/27追記) kanikoのイメージは debug タグを利用する必要があります.latest タグのイメージでは以下のエラーが出て動作しないようです.

Error: failed to start container "build": Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown