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

参考

その他リンク