Docker 레이어 캐싱을 사용하여 Docker-in-Docker 빌드를 더 빠르게 만들기
Docker-in-Docker를 사용할 때, Docker는 빌드를 생성할 때마다 이미지의 모든 레이어를 다운로드합니다. 최근 버전의 Docker (Docker 1.13 이상)은 docker build
단계 중에 기존 이미지를 캐시로 사용할 수 있습니다. 이는 빌드 프로세스를 크게 가속화합니다.
Docker 캐싱 작동 방식
docker build
를 실행할 때, Dockerfile
의 각 명령은 레이어를 생성합니다. 이러한 레이어는 캐시로 유지되며 변경 사항이 없는 경우 재사용할 수 있습니다. 하나의 레이어의 변경은 모든 후속 레이어의 재생성을 유발합니다.
docker build
명령에 캐시 소스로 사용할 태그가 지정된 이미지를 지정하려면 --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:
# 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
명령의 캐시로 사용할 수 있도록 시도합니다. - 두 번째 몤령은 사용 가능한 경우, 가져온 이미지를 캐시로 사용하여 Docker 이미지를 빌드하고 태그를 지정합니다 (설명:
--cache-from $CI_REGISTRY_IMAGE:latest
인수 참조). - 마지막 두 명령은 태그가 지정된 Docker 이미지를 컨테이너 레지스트리에 푸시하여 후속 빌드의 캐시로도 사용할 수 있도록 합니다.