컨테이너 이미지 빌드 및 레지스트리로 푸시하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

컨테이너 이미지를 빌드하고 레지스트리로 푸시하기 전에, 반드시 컨테이너 레지스트리와 인증을 해야합니다.

Docker 명령어 사용

Docker 명령어를 사용하여 컨테이너 이미지를 빌드하고 레지스트리로 푸시할 수 있습니다:

  1. 컨테이너 레지스트리와 인증을 합니다.
  2. Docker 명령어를 실행하여 빌드하거나 푸시합니다. 예를 들면:

    • 빌드하기:

      docker build -t registry.example.com/group/project/image .
      
    • 푸시하기:

      docker push registry.example.com/group/project/image
      

.gitlab-ci.yml 파일 구성

.gitlab-ci.yml 파일을 구성하여 컨테이너 이미지를 빌드하고 레지스트리로 푸시할 수 있습니다.

  • 여러 작업에서 인증이 필요한 경우, before_script에 인증 명령을 추가합니다.
  • 빌드하기 전에, docker build --pull을 사용하여 기본 이미지의 변경 사항을 가져옵니다. 약간 시간은 걸리지만 이미지가 최신 상태임을 보장합니다.
  • docker run 전에, 방금 빌드된 이미지를 명시적으로 docker pull하여 가져옵니다. 특히 로컬에 이미지를 캐시하는 여러 실행기를 사용하는 경우 이 단계가 중요합니다.

    이미지 태그에 Git SHA를 사용하는 경우 각 작업은 고유하며 오래된 이미지는 절대로 발생하지 않아야 합니다. 그러나 의존성이 변경된 후 특정 커밋을 다시 빌드하는 경우에는 여전히 오래된 이미지가 발생할 수 있습니다.

  • 중요한 주: 여러 작업이 동시에 발생할 수 있으므로 latest 태그에 직접 빌드하지 마십시오.

GitLab CI/CD 사용

GitLab CI/CD를 사용하여 컨테이너 레지스트리로 컨테이너 이미지를 빌드하고 푸시할 수 있습니다. CI/CD를 사용하여 작성한 프로젝트를 테스트하고 빌드하며 릴리스된 컨테이너 이미지를 배포할 수 있습니다.

컨테이너 레지스트리에 대한 GitLab CI/CD 예제

러너(runner)에서 Docker-in-Docker를 사용하는 경우, .gitlab-ci.yml 파일은 다음과 유사해야 합니다:

build:
  image: $CI_REGISTRY/group/project/docker:20.10.16
  services:
    - name: $CI_REGISTRY/group/project/docker:20.10.16-dind
      alias: docker
  stage: build
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

서비스 별칭을 설정하지 않은 경우, 컨테이너 이미지가 dind 서비스를 찾을 수 없고 다음과 유사한 오류가 표시됩니다:

error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host

의존성 프록시를 사용한 Docker-in-Docker 컨테이너 이미지 예제

의존성 프록시를 사용하여 컨테이너 이미지를 빌드하고 푸시하려면 .gitlab-ci.yml 파일은 다음과 유사해야 합니다:

build:
  image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:20.10.16
  services:
    - name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/docker:18.09.7-dind
      alias: docker
  stage: build
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

서비스 별칭을 설정하지 않은 경우, 컨테이너 이미지가 dind 서비스를 찾을 수 없고 다음과 유사한 오류가 표시됩니다:

error during connect: Get http://docker:2376/v1.39/info: dial tcp: lookup docker on 192.168.0.1:53: no such host

GitLab CI/CD로 컨테이너 레지스트리 예제 사용

러너(runner)에서 Docker-in-Docker를 사용하는 경우, .gitlab-ci.yml 파일은 다음과 유사해야 합니다:

build:
  image: docker:20.10.16
  stage: build
  services:
    - docker:20.10.16-dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY/group/project/image:latest .
    - docker push $CI_REGISTRY/group/project/image:latest

.gitlab-ci.yml 파일에서 CI/CD 변수를 사용할 수 있습니다. 예를 들면:

build:
  image: docker:20.10.16
  stage: build
  services:
    - docker:20.10.16-dind
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

이 예제에서, $CI_REGISTRY_IMAGE는 이 프로젝트와 연결된 레지스트리 주소를 해결합니다. $CI_COMMIT_REF_NAME은 브랜치 또는 태그 이름이며 /를 포함할 수 있습니다. 이미지 태그에는 /가 포함될 수 없습니다. 이미지 태그로 $CI_COMMIT_REF_SLUG를 사용하세요.

NOTE:

이 예제에서는 명시적으로 docker pull를 호출합니다. 암묵적으로 image:를 사용하여 컨테이너 이미지를 끌어오고 pull_policyalways로 설정하여 Docker 또는 Kubernetes 실행기를 사용하는 경우 컨테이너 이미지를 암묵적으로 끌어오도록 하세요.