前回の記事(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.0
stages:
- build
build:
stage: build
image: docker:24.0
services:
- docker:dind
rules:
# Release
- if: $CI_COMMIT_TAG
variables:
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_BRANCH
variables:
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