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 で説明されている内容を元にしています.
ここでは,以下の前提とします.
- Kubernetes上のPodにIAM Roleを割り当てることが可能なこと(kube2iam等を利用)
- Kubernetes上にGitLab Runnerがデプロイされていること
- GitLabのリポジトリにソースコードとDockerfileが配置されていること
- Amazon ECRにリポジトリを作成済みであること
IAM Roleの割り当て
GitLab Runner workerがECRにアクセスできるように,GitLab Runner workerのPodにIAM Roleを割り当てます.具体的な方法は下記を参照してください.
.gitlab-ci.ymlの作成
kanikoを利用するには gcr.io/kaniko-project/executor
イメージを指定します.イメージには amazon-ecr-credential-helper が組み込まれており,/kaniko/.docker/config.json
で credHelpers
を設定すると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