DockerレイヤーキャッシングでDocker-in-Dockerビルドを高速化します。

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

Dockerのキャッシングの仕組み

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

docker build コマンドのキャッシュソースとして使用するタグ付き画像を指定するには、--cache-from 引数を --cache-from使用します。複数の引数を使うことで、--cache-from 複数の画像をキャッシュソースとして指定 --cache-fromできます。--cache-from 引数で使用される画像は、キャッシュ・ソースとして使用する前に(docker pullを使用して)プルする必要があります。

Dockerキャッシュの例

この例.gitlab-ci.yml ファイルはDockerキャッシングの使い方を示しています:

default:
  image: docker:24.0.5
  services:
    - docker:24.0.5-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 --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 コマンドのキャッシュとして使用できるように、レジストリからイメージを取り出そうとします。
  2. 2番目のコマンドは、引き出されたイメージがあればそれをキャッシュ(--cache-from $CI_REGISTRY_IMAGE:latest の引数を参照)として使ってDockerイメージを構築し、タグを付けます。
  3. 最後の2つのコマンドは、タグ付けされたDockerイメージをコンテナレジストリにプッシュし、後続のビルドのキャッシュとしても使用できるようにします。