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:latestbuildジョブのscriptセクション:
- 最初のコマンドは、
docker buildコマンドのキャッシュとして使用できるように、レジストリからイメージをプルしようとします。--cache-from引数で使用されるイメージは、キャッシュソースとして使用する前に、(docker pullを使用して)プルする必要があります。 - 2番目のコマンドは、プルされたイメージがキャッシュとして使用可能であればそれを使用して(
--cache-from $CI_REGISTRY_IMAGE:latest引数を参照)、Dockerイメージをビルドし、タグを付けます。--build-arg BUILDKIT_INLINE_CACHE=1は、インラインキャッシュを使用するようにDockerに指示し、ビルドキャッシュをイメージ自体に埋め込みます。 - 最後の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:
registryキャッシュバックエンドをサポートするdocker-containerBuildKitドライバーを作成し、構成します。以下を使用してDockerイメージをビルドし、プッシュします:
--cache-from type=registry,ref=$CI_REGISTRY_IMAGE/cache-imageを使用した専用キャッシュイメージ。--cache-to type=registry,ref=$CI_REGISTRY_IMAGE/cache-image,mode=maxを使用したキャッシュの更新。ここで、maxモードは中間レイヤーをキャッシュします。