正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

Dockerレイヤーのキャッシュを使用して、Docker-in-Dockerのビルドを高速化する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated

Docker-in-Dockerを使用すると、ビルドを作成するたびに、Dockerはイメージのすべてのレイヤーをダウンロードします。Dockerの最新バージョン(Docker 1.13以降)では、docker buildステップ中に既存のイメージをキャッシュとして使用できます。これにより、ビルドプロセスが大幅に高速化されます。

Docker 27.0.1以降では、デフォルトのdockerビルドドライバーは、containerdイメージストアが有効になっている場合にのみキャッシュバックエンドをサポートします。

Docker 27.0.1以降でDockerキャッシュを使用するには、次のいずれかを実行します:

  • Dockerデーモン設定でcontainerdイメージストアを有効にします。
  • 別のビルドドライバーを選択します。

詳細については、キャッシュストレージバックエンドを参照してください。

Dockerキャッシュの仕組み

docker buildを実行すると、Dockerfile内の各コマンドがレイヤーを作成します。これらのレイヤーはキャッシュとして保持され、変更がない場合は再利用できます。1つのレイヤーを変更すると、後続のすべてのレイヤーが再作成されます。

docker buildコマンドのキャッシュソースとして使用するタグ付きイメージを指定するには、--cache-from引数を使用します。複数の--cache-from引数を使用すると、複数のイメージをキャッシュソースとして指定できます。

Dockerインラインキャッシュの例

次の例の.gitlab-ci.ymlファイルは、デフォルトのdocker buildコマンドでinlineキャッシュバックエンドを使用したDockerキャッシュの使用方法を示しています。

default:
  image: docker:27.4.1
  services:
    - docker:27.4.1-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

variables:
  # Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  script:
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

buildジョブのscriptセクション:

  1. 最初のコマンドは、docker buildコマンドのキャッシュとして使用できるように、レジストリからイメージをプルしようとします。--cache-from引数で使用されるイメージは、キャッシュソースとして使用する前に、(docker pullを使用して)プルする必要があります。
  2. 2番目のコマンドは、プルされたイメージがキャッシュとして使用可能であればそれを使用して(--cache-from $CI_REGISTRY_IMAGE:latest引数を参照)、Dockerイメージをビルドし、タグを付けます。--build-arg BUILDKIT_INLINE_CACHE=1は、インラインキャッシュを使用するようにDockerに指示し、ビルドキャッシュをイメージ自体に埋め込みます。
  3. 最後の2つのコマンドは、タグ付けされたDockerイメージをコンテナレジストリにプッシュして、後続のビルドのキャッシュとしても使用できるようにします。

Dockerレジストリキャッシュの例

Dockerビルドを、レジストリ内の専用キャッシュイメージに直接キャッシュできます。

次の例の.gitlab-ci.ymlファイルは、docker buildx buildコマンドとregistryキャッシュバックエンドでDockerキャッシュを使用する方法を示しています。より高度なキャッシュオプションについては、キャッシュストレージバックエンドを参照してください。

default:
  image: docker:27.4.1
  services:
    - docker:27.4.1-dind
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

variables:
  # Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  script:
    - docker context create my-builder
    - docker buildx create my-builder --driver docker-container --use
    - docker buildx build --push -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
      --cache-to type=registry,ref=$CI_REGISTRY_IMAGE/cache-image,mode=max
      --cache-from type=registry,ref=$CI_REGISTRY_IMAGE/cache-image .

buildジョブのscript:

  1. registryキャッシュバックエンドをサポートするdocker-container BuildKitドライバーを作成し、構成します。

  2. 以下を使用してDockerイメージをビルドし、プッシュします:

    • --cache-from type=registry,ref=$CI_REGISTRY_IMAGE/cache-imageを使用した専用キャッシュイメージ。
    • --cache-to type=registry,ref=$CI_REGISTRY_IMAGE/cache-image,mode=maxを使用したキャッシュの更新。ここで、maxモードは中間レイヤーをキャッシュします。