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.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関連のメタデータを付加することができます。

参考

その他リンク