GitLab CI, DockerイメージをビルドしてContainer Registryにpushする(2023年版)
前回の記事(2021年版)から、以下の内容でアップデートしました。
- Docker Engine 24.0
- BuildKit
- レイヤーキャッシュ(Registry cache)
- タグによるバージョン付け
注意:Self Hosted GitLab RunnerでのDockerデーモンを使ったイメージビルドは推奨しません
DinDでのビルドのため、ホストOSのroot権限が取得可能な、コンテナの特権実行(--privileged
)、またはDockerソケットのマウント(DooD)が要求されます。
GitLab.comのShared Runnerは使い捨てのGCPインスタンスで提供されるため、コンテナブレイクアウト等によりホストのroot権限が取得されても、 Dockerエンジンのホストである仮想マシンごと破棄されますが、そのような工夫をしていないRunner(VPSやベアメタル)では、 CIジョブの実行により、ホストのroot権限で悪意ある操作が実行され、また、その影響が持続する危険性があります。
Dockerデーモンを必要としない、代替ソフトウェアによるDockerイメージビルドを検討してください。
リポジトリ構造
- .gitlab-ci.yml
- Dockerfile
.gitlab-ci.yml
# License: CC0-1.0stages:- buildbuild:stage: buildimage: docker:24.0services:- docker:dindrules:# Release- if: $CI_COMMIT_TAGvariables:DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache"DOCKER_CACHE_TO: ""# Default branch- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCHvariables:DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:latest"DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache"DOCKER_CACHE_TO: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache,mode=max"script:- apk add --no-cache git- docker buildx create --use- docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}"- >docker buildx build .-t "${DOCKER_IMAGE_NAME_AND_TAG}"--cache-from "${DOCKER_CACHE_FROM}"--cache-to "${DOCKER_CACHE_TO}"--push
- ※ docker buildx buildのコマンドは複数行になっていますが、2行目以降を1行目と異なるインデント数にしないでください。2行目以降が別のコマンド扱いになり、動作しなくなります。
docker buildx create --use
docker buildx build
実行時に、以下のようなエラーが出るため追加しています。
ERROR: cache export feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
関連トピック:SLSA
SLSA(Supply-chain Levels for Software Artifacts、サルサ)は、ソフトウェアのサプライチェーンを検証可能にしようという仕組みです。 米国の大統領令EO14028、EUのサイバーレジリエンス法(CRA)などの規制に関連する可能性があります。
Dockerでは、--provenance
オプションが導入され、DockerイメージにSLSA関連のメタデータを付加することができます。
- docker/build-push-action v3.3.0で導入されたprovenanceオプションにまつわる問題 - chroju.dev/blog
- 【Infostand海外ITトピックス】オープンソース業界に広がる懸念 欧州で導入予定のサイバーレジリエンス法 - クラウド Watch
- 米国大統領令とEUのCRAが示すソフトウェアサプライチェーンセキュリティとは:ソフトウェアサプライチェーンの守り方(1)(1/2 ページ) - MONOist
- SLSA • Supply-chain Levels for Software Artifacts
- SLSAとは【用語集詳細】
- aoirint🎐: "👀 / docker/build-push-action …" - mstdn.aoirint.com
参考
- Release CI/CD examples | GitLab
- YAMLで複数行テキストを書きたい時のあれこれ - Qiita
- GitLab CIでDockerイメージをビルドする - Qiita
- Registry cache | Docker Documentation
- if statement - How to use if-else condition on gitlabci - Stack Overflow
- GitLab CI/CD variables | GitLab
- Choose when to run jobs | GitLab