InfoGrab Docs

Docker-in-Docker 빌드에서 Docker 레이어 캐싱

요약

Docker-in-Docker를 사용할 때 Docker는 빌드할 때마다 이미지의 모든 레이어를 다운로드합니다. Docker가 docker build를 실행할 때 각 Dockerfile 명령은 레이어를 생성합니다. Docker 27.0.1 이상에서 기본 docker 빌드 드라이버는 containerd 이미지 저장소가 활성화된 경우에만 캐시 백엔드를 지원합니다.

Docker-in-Docker를 사용할 때 Docker는 빌드할 때마다 이미지의 모든 레이어를 다운로드합니다. Docker 1.13 이상은 docker build 단계에서 기존 이미지를 캐시로 사용할 수 있어 빌드 프로세스가 크게 빨라집니다.

Docker가 docker build를 실행할 때 각 Dockerfile 명령은 레이어를 생성합니다. Docker는 이 레이어를 캐시로 보존하고 변경 사항이 없으면 재사용합니다. 한 레이어가 변경되면 이후 모든 레이어가 재빌드됩니다. docker build의 캐시 소스로 태그된 이미지를 사용하려면 --cache-from 인수를 전달합니다. 여러 캐시 소스를 지정하려면 --cache-from을 여러 번 사용합니다.

사전 조건#

Docker 27.0.1 이상에서 기본 docker 빌드 드라이버는 containerd 이미지 저장소가 활성화된 경우에만 캐시 백엔드를 지원합니다. 다음 중 하나를 수행합니다:

  • Docker 데몬 구성에서 containerd 이미지 저장소를 활성화합니다.
  • 다른 빌드 드라이버를 선택합니다.

인라인 캐싱 사용#

기본 docker build 명령과 함께 inline 캐시 백엔드를 사용합니다. 캐싱을 시작하는 가장 간단한 방법입니다. 캐시는 별도의 캐시 이미지 없이 이미지 자체에 저장됩니다. 복잡한 빌드 흐름이나 멀티 스테이지 빌드의 경우, 대신 레지스트리 캐싱을 사용하세요. 자세한 내용은 인라인 캐싱 옵션을 참조하세요.

Note

--build-arg BUILDKIT_INLINE_CACHE=1 인수는 필수입니다. 이 인수는 Docker가 이미지에 캐시 메타데이터를 내장하도록 지시하여 이후 빌드에서 --cache-from으로 캐시 소스로 사용할 수 있게 합니다. 이 인수 없이는 캐싱이 자동으로 실패합니다.

파이프라인에서 인라인 캐싱을 사용하려면:

  1. 프로젝트에 다음 .gitlab-ci.yml 구성을 추가합니다:
default:
  image: docker:27.4.1-cli
  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/ci/docker/using_docker_build/#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:latest

build job script에서:

첫 번째 명령은 레지스트리에서 이미지를 가져와 캐시 소스로 사용하려고 시도합니다. --cache-from과 함께 사용하는 이미지는 사용하기 전에 docker pull로 가져와야 합니다.

  • 두 번째 명령은 가져온 이미지를 캐시로 사용하여 Docker 이미지를 빌드하고(--cache-from $CI_REGISTRY_IMAGE:latest 사용) 태그를 지정합니다. --build-arg BUILDKIT_INLINE_CACHE=1 플래그는 빌드 캐시를 이미지에 내장합니다.

  • 마지막 두 명령은 두 태그된 이미지를 컨테이너 레지스트리에 푸시하여 향후 빌드에서 캐시로 사용할 수 있도록 합니다.

레지스트리 캐싱 사용#

docker buildx build와 함께 registry 캐시 백엔드를 사용하여 빌드 캐시를 애플리케이션 이미지와 분리된 전용 캐시 이미지에 저장합니다. 멀티 스테이지 빌드와 복잡한 빌드 흐름에서 인라인 캐싱보다 확장성이 좋습니다. 자세한 내용은 캐시 백엔드 옵션을 참조하세요.

파이프라인에서 레지스트리 캐싱을 사용하려면:

  1. 프로젝트에 다음 .gitlab-ci.yml 구성을 추가합니다:
default:
  image: docker:27.4.1-cli
  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/ci/docker/using_docker_build/#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 job script에서:

처음 두 명령은 registry 캐시 백엔드를 지원하는 docker-container BuildKit 드라이버를 생성하고 구성합니다.

  • 세 번째 명령은 Docker 이미지를 빌드하고 푸시합니다. --cache-from으로 전용 캐시 이미지에서 읽고, --cache-to로 업데이트합니다. max 모드는 모든 중간 레이어를 캐시합니다.

Docker-in-Docker 빌드에서 Docker 레이어 캐싱

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

Docker-in-Docker를 사용할 때 Docker는 빌드할 때마다 이미지의 모든 레이어를 다운로드합니다. Docker가 docker build를 실행할 때 각 Dockerfile 명령은 레이어를 생성합니다. Docker 27.0.1 이상에서 기본 docker 빌드 드라이버는 containerd 이미지 저장소가 활성화된 경우에만 캐시 백엔드를 지원합니다.

Docker-in-Docker를 사용할 때 Docker는 빌드할 때마다 이미지의 모든 레이어를 다운로드합니다. Docker 1.13 이상은 docker build 단계에서 기존 이미지를 캐시로 사용할 수 있어 빌드 프로세스가 크게 빨라집니다.

Docker가 docker build를 실행할 때 각 Dockerfile 명령은 레이어를 생성합니다. Docker는 이 레이어를 캐시로 보존하고 변경 사항이 없으면 재사용합니다. 한 레이어가 변경되면 이후 모든 레이어가 재빌드됩니다. docker build의 캐시 소스로 태그된 이미지를 사용하려면 --cache-from 인수를 전달합니다. 여러 캐시 소스를 지정하려면 --cache-from을 여러 번 사용합니다.

사전 조건#

Docker 27.0.1 이상에서 기본 docker 빌드 드라이버는 containerd 이미지 저장소가 활성화된 경우에만 캐시 백엔드를 지원합니다. 다음 중 하나를 수행합니다:

  • Docker 데몬 구성에서 containerd 이미지 저장소를 활성화합니다.
  • 다른 빌드 드라이버를 선택합니다.

인라인 캐싱 사용#

기본 docker build 명령과 함께 inline 캐시 백엔드를 사용합니다. 캐싱을 시작하는 가장 간단한 방법입니다. 캐시는 별도의 캐시 이미지 없이 이미지 자체에 저장됩니다. 복잡한 빌드 흐름이나 멀티 스테이지 빌드의 경우, 대신 레지스트리 캐싱을 사용하세요. 자세한 내용은 인라인 캐싱 옵션을 참조하세요.

Note

--build-arg BUILDKIT_INLINE_CACHE=1 인수는 필수입니다. 이 인수는 Docker가 이미지에 캐시 메타데이터를 내장하도록 지시하여 이후 빌드에서 --cache-from으로 캐시 소스로 사용할 수 있게 합니다. 이 인수 없이는 캐싱이 자동으로 실패합니다.

파이프라인에서 인라인 캐싱을 사용하려면:

  1. 프로젝트에 다음 .gitlab-ci.yml 구성을 추가합니다:
default:
  image: docker:27.4.1-cli
  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/ci/docker/using_docker_build/#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:latest

build job script에서:

첫 번째 명령은 레지스트리에서 이미지를 가져와 캐시 소스로 사용하려고 시도합니다. --cache-from과 함께 사용하는 이미지는 사용하기 전에 docker pull로 가져와야 합니다.

  • 두 번째 명령은 가져온 이미지를 캐시로 사용하여 Docker 이미지를 빌드하고(--cache-from $CI_REGISTRY_IMAGE:latest 사용) 태그를 지정합니다. --build-arg BUILDKIT_INLINE_CACHE=1 플래그는 빌드 캐시를 이미지에 내장합니다.

  • 마지막 두 명령은 두 태그된 이미지를 컨테이너 레지스트리에 푸시하여 향후 빌드에서 캐시로 사용할 수 있도록 합니다.

레지스트리 캐싱 사용#

docker buildx build와 함께 registry 캐시 백엔드를 사용하여 빌드 캐시를 애플리케이션 이미지와 분리된 전용 캐시 이미지에 저장합니다. 멀티 스테이지 빌드와 복잡한 빌드 흐름에서 인라인 캐싱보다 확장성이 좋습니다. 자세한 내용은 캐시 백엔드 옵션을 참조하세요.

파이프라인에서 레지스트리 캐싱을 사용하려면:

  1. 프로젝트에 다음 .gitlab-ci.yml 구성을 추가합니다:
default:
  image: docker:27.4.1-cli
  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/ci/docker/using_docker_build/#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 job script에서:

처음 두 명령은 registry 캐시 백엔드를 지원하는 docker-container BuildKit 드라이버를 생성하고 구성합니다.

  • 세 번째 명령은 Docker 이미지를 빌드하고 푸시합니다. --cache-from으로 전용 캐시 이미지에서 읽고, --cache-to로 업데이트합니다. max 모드는 모든 중간 레이어를 캐시합니다.