InfoGrab Docs

Docker-in-Docker에서 레지스트리로 인증

요약

Docker-in-Docker를 사용하면 서비스와 함께 새로운 Docker 데몬이 시작되기 때문에 표준 인증 방법이 작동하지 않습니다. before_script에서 docker login을 실행합니다: Docker Hub에 로그인하려면 $DOCKER_REGISTRY를 비워두거나 제거합니다.

Docker-in-Docker를 사용하면 서비스와 함께 새로운 Docker 데몬이 시작되기 때문에 표준 인증 방법이 작동하지 않습니다.

옵션 1: docker login 실행#

before_script에서 docker login을 실행합니다:

default:
  image: docker:24.0.5-cli
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

Docker Hub에 로그인하려면 $DOCKER_REGISTRY를 비워두거나 제거합니다.

옵션 2: 각 job에 ~/.docker/config.json 마운트#

GitLab Runner 관리자인 경우 인증 구성이 담긴 파일을 ~/.docker/config.json에 마운트할 수 있습니다. 그러면 러너가 가져오는 모든 job이 이미 인증되어 있습니다. 공식 docker:24.0.5 이미지를 사용하는 경우 홈 디렉터리는 /root 아래에 있습니다.

구성 파일을 마운트하면 ~/.docker/config.json을 수정하는 모든 docker 명령이 실패합니다. 예를 들어 파일이 읽기 전용으로 마운트되기 때문에 docker login이 실패합니다. 문제가 발생하므로 읽기 전용에서 변경하지 마세요.

다음은 DOCKER_AUTH_CONFIG 설명서를 따르는 /opt/.docker/config.json의 예시입니다:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="
        }
    }
}

Docker#

파일을 포함하도록 볼륨 마운트를 업데이트합니다.

[[runners]]
  ...
  executor = "docker"
  [runners.docker]
    ...
    privileged = true
    volumes = ["/opt/.docker/config.json:/root/.docker/config.json:ro"]

Kubernetes#

이 파일의 내용으로 ConfigMap을 만듭니다. 다음과 같은 명령으로 만들 수 있습니다:

kubectl create configmap docker-client-config --namespace gitlab-runner --from-file /opt/.docker/config.json

파일을 포함하도록 볼륨 마운트를 업데이트합니다.

[[runners]]
  ...
  executor = "kubernetes"
  [runners.kubernetes]
    image = "alpine:3.12"
    privileged = true
    [[runners.kubernetes.volumes.config_map]]
      name = "docker-client-config"
      mount_path = "/root/.docker/config.json"
      sub_path = "config.json"

옵션 3: DOCKER_AUTH_CONFIG 사용#

DOCKER_AUTH_CONFIG가 이미 정의되어 있으면 변수를 사용하여 ~/.docker/config.json에 저장할 수 있습니다.

이 인증을 여러 가지 방법으로 정의할 수 있습니다:

다음 예시는 before_script를 보여줍니다. 동일한 명령이 구현하는 모든 솔루션에 적용됩니다.

default:
  image: docker:24.0.5-cli
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - mkdir -p $HOME/.docker
    - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

Docker-in-Docker에서 레지스트리로 인증

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

Docker-in-Docker를 사용하면 서비스와 함께 새로운 Docker 데몬이 시작되기 때문에 표준 인증 방법이 작동하지 않습니다. before_script에서 docker login을 실행합니다: Docker Hub에 로그인하려면 $DOCKER_REGISTRY를 비워두거나 제거합니다.

Docker-in-Docker를 사용하면 서비스와 함께 새로운 Docker 데몬이 시작되기 때문에 표준 인증 방법이 작동하지 않습니다.

옵션 1: docker login 실행#

before_script에서 docker login을 실행합니다:

default:
  image: docker:24.0.5-cli
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests

Docker Hub에 로그인하려면 $DOCKER_REGISTRY를 비워두거나 제거합니다.

옵션 2: 각 job에 ~/.docker/config.json 마운트#

GitLab Runner 관리자인 경우 인증 구성이 담긴 파일을 ~/.docker/config.json에 마운트할 수 있습니다. 그러면 러너가 가져오는 모든 job이 이미 인증되어 있습니다. 공식 docker:24.0.5 이미지를 사용하는 경우 홈 디렉터리는 /root 아래에 있습니다.

구성 파일을 마운트하면 ~/.docker/config.json을 수정하는 모든 docker 명령이 실패합니다. 예를 들어 파일이 읽기 전용으로 마운트되기 때문에 docker login이 실패합니다. 문제가 발생하므로 읽기 전용에서 변경하지 마세요.

다음은 DOCKER_AUTH_CONFIG 설명서를 따르는 /opt/.docker/config.json의 예시입니다:

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ="
        }
    }
}

Docker#

파일을 포함하도록 볼륨 마운트를 업데이트합니다.

[[runners]]
  ...
  executor = "docker"
  [runners.docker]
    ...
    privileged = true
    volumes = ["/opt/.docker/config.json:/root/.docker/config.json:ro"]

Kubernetes#

이 파일의 내용으로 ConfigMap을 만듭니다. 다음과 같은 명령으로 만들 수 있습니다:

kubectl create configmap docker-client-config --namespace gitlab-runner --from-file /opt/.docker/config.json

파일을 포함하도록 볼륨 마운트를 업데이트합니다.

[[runners]]
  ...
  executor = "kubernetes"
  [runners.kubernetes]
    image = "alpine:3.12"
    privileged = true
    [[runners.kubernetes.volumes.config_map]]
      name = "docker-client-config"
      mount_path = "/root/.docker/config.json"
      sub_path = "config.json"

옵션 3: DOCKER_AUTH_CONFIG 사용#

DOCKER_AUTH_CONFIG가 이미 정의되어 있으면 변수를 사용하여 ~/.docker/config.json에 저장할 수 있습니다.

이 인증을 여러 가지 방법으로 정의할 수 있습니다:

다음 예시는 before_script를 보여줍니다. 동일한 명령이 구현하는 모든 솔루션에 적용됩니다.

default:
  image: docker:24.0.5-cli
  services:
    - docker:24.0.5-dind

variables:
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  before_script:
    - mkdir -p $HOME/.docker
    - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json
  script:
    - docker build -t my-docker-image .
    - docker run my-docker-image /script/to/run/tests