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