Docker 레이어 캐싱을 사용하여 Docker-in-Docker 빌드 속도 향상

Docker-in-Docker를 사용할 때마다 이미지의 모든 레이어를 모두 다운로드합니다. 최근 버전의 Docker (Docker 1.13 이상)는 docker build 단계에서 기존 이미지를 캐시로 사용할 수 있습니다. 이로써 빌드 프로세스가 크게 가속화됩니다.

Docker 캐싱 작동 방식

docker build를 실행하면 Dockerfile의 각 명령이 레이어를 생성합니다. 이러한 레이어는 캐시로 보관되며 변경 사항이 없으면 재사용할 수 있습니다. 하나의 레이어가 변경되면 그 뒤에 있는 모든 레이어가 재생성됩니다.

docker build 명령에 대한 캐시 원본으로 태그가 지정된 이미지를 지정하려면 --cache-from 인수를 사용합니다. 여러 이미지를 캐시 원본으로 지정하려면 여러 --cache-from 인수를 사용합니다. --cache-from 인수로 사용되는 모든 이미지는 캐시 원본으로 사용되기 전에 (docker pull을 사용하여) 가져와야 합니다.

Docker 캐싱 예시

다음 예시는 Docker 캐싱을 사용하는 .gitlab-ci.yml 파일을 보여줍니다.

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 섹션에서:

  1. 첫 번째 명령은 레지스트리에서 이미지를 가져와 docker build 명령의 캐시로 사용할 수 있도록 시도합니다.
  2. 두 번째 명령은 가져온 이미지를 사용하여 Docker 이미지를 빌드하고 캐시로 사용합니다 (기존에 사용 가능한 경우 --cache-from $CI_REGISTRY_IMAGE:latest 인수를 참조하여) 그리고 태그합니다.
  3. 마지막 두 명령은 태그가 지정된 Docker 이미지를 컨테이너 레지스트리에 푸시하여 이후 빌드의 캐시로 사용할 수 있도록 합니다.