InfoGrab Docs

Docker 빌드 문제 해결

요약

이 오류는 Docker-in-Docker v19.03 이상을 사용할 때 흔히 발생합니다: 이 오류는 Docker가 자동으로 TLS를 시작하기 때문에 발생합니다. 이 오류는 Docker-in-Docker 서비스가 완전히 시작되기 전에 접근을 시도할 때 Kubernetes executor에서도 발생할 수 있습니다.

오류: docker: Cannot connect to the Docker daemon at tcp://docker:2375#

이 오류는 Docker-in-Docker v19.03 이상을 사용할 때 흔히 발생합니다:

docker: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

이 오류는 Docker가 자동으로 TLS를 시작하기 때문에 발생합니다.

이 오류는 Docker-in-Docker 서비스가 완전히 시작되기 전에 접근을 시도할 때 Kubernetes executor에서도 발생할 수 있습니다. 자세한 설명은 이슈 27215를 참조하세요.

Docker no such host 오류#

docker: error during connect: Post https://docker:2376/v1.40/containers/create: dial tcp: lookup docker on x.x.x.x:53: no such host라는 오류가 발생할 수 있습니다.

이 문제는 서비스의 이미지 이름에 레지스트리 호스트 이름이 포함될 때 발생할 수 있습니다. 예를 들어:

default:
  image: docker:24.0.5-cli
  services:
    - registry.hub.docker.com/library/docker:24.0.5-dind

서비스의 호스트 이름은 전체 이미지 이름에서 파생됩니다. 그러나 더 짧은 서비스 호스트 이름 docker가 예상됩니다. 서비스 확인 및 접근을 허용하려면 서비스 이름 docker에 대한 명시적 별칭을 추가합니다:

default:
  image: docker:24.0.5-cli
  services:
    - name: registry.hub.docker.com/library/docker:24.0.5-dind
      alias: docker

오류: Cannot connect to the Docker daemon at unix:///var/run/docker.sock#

dind 서비스에 접근하기 위해 docker 명령을 실행하려고 할 때 다음 오류가 발생할 수 있습니다:

$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

작업에 다음 환경 변수가 정의되어 있는지 확인하세요:

  • DOCKER_HOST
  • DOCKER_TLS_CERTDIR (선택 사항)
  • DOCKER_TLS_VERIFY (선택 사항)

Docker 클라이언트를 제공하는 이미지를 업데이트할 수도 있습니다. 예를 들어, docker/compose 이미지는 더 이상 사용되지 않으며 docker로 교체해야 합니다.

러너 이슈 30944에 설명된 것처럼, 작업이 이전에 DOCKER_PORT_2375_TCP와 같이 더 이상 사용되지 않는 Docker --link 매개변수에서 파생된 환경 변수에 의존했던 경우 이 오류가 발생할 수 있습니다. 다음 조건이 충족되면 작업이 이 오류와 함께 실패합니다:

  • CI/CD 이미지가 DOCKER_PORT_2375_TCP와 같은 레거시 변수에 의존합니다.
  • 러너 기능 플래그 FF_NETWORK_PER_BUILDtrue로 설정되어 있습니다.
  • DOCKER_HOST가 명시적으로 설정되어 있지 않습니다.

오류: unauthorized: incorrect username or password#

이 오류는 더 이상 사용되지 않는 변수 CI_BUILD_TOKEN을 사용할 때 나타납니다:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password

사용자가 이 오류를 받지 않도록 하려면:

  • 대신 CI_JOB_TOKEN을 사용합니다.
  • gitlab-ci-token/CI_BUILD_TOKEN에서 $CI_REGISTRY_USER/$CI_REGISTRY_PASSWORD로 변경합니다.

연결 오류: no such host#

이 오류는 dind 서비스가 시작에 실패했을 때 나타납니다:

error during connect: Post "https://docker:2376/v1.24/auth": dial tcp: lookup docker on 127.0.0.11:53: no such host

작업 로그에 mount: permission denied (are you root?)가 나타나는지 확인하세요. 예를 들어:

Service container logs:
2023-08-01T16:04:09.541703572Z Certificate request self-signature ok
2023-08-01T16:04:09.541770852Z subject=CN = docker:dind server
2023-08-01T16:04:09.556183222Z /certs/server/cert.pem: OK
2023-08-01T16:04:10.641128729Z Certificate request self-signature ok
2023-08-01T16:04:10.641173149Z subject=CN = docker:dind client
2023-08-01T16:04:10.656089908Z /certs/client/cert.pem: OK
2023-08-01T16:04:10.659571093Z ip: can't find device 'ip_tables'
2023-08-01T16:04:10.660872131Z modprobe: can't change directory to '/lib/modules': No such file or directory
2023-08-01T16:04:10.664620455Z mount: permission denied (are you root?)
2023-08-01T16:04:10.664692175Z Could not mount /sys/kernel/security.
2023-08-01T16:04:10.664703615Z AppArmor detection and --privileged mode might break.
2023-08-01T16:04:10.665952353Z mount: permission denied (are you root?)

이는 GitLab Runner가 dind 서비스를 시작할 권한이 없음을 나타냅니다:

  1. config.tomlprivileged = true가 설정되어 있는지 확인합니다.
  2. CI 작업에 이러한 권한 있는 러너를 사용할 올바른 러너 태그가 있는지 확인합니다.

오류: cgroups: cgroup mountpoint does not exist: unknown#

Docker Engine 20.10에서 도입된 알려진 비호환성이 있습니다.

호스트가 Docker Engine 20.10 이상을 사용하는 경우, 20.10보다 이전 버전의 docker:dind 서비스는 예상대로 작동하지 않습니다.

서비스 자체는 문제 없이 시작되지만, 컨테이너 이미지를 빌드하려고 하면 다음 오류가 발생합니다:

cgroups: cgroup mountpoint does not exist: unknown

이 문제를 해결하려면 docker:dind 컨테이너를 최소 20.10.x 버전(예: docker:24.0.5-dind)으로 업데이트합니다.

반대 구성(docker:24.0.5-dind 서비스 및 호스트의 Docker Engine 버전 19.06.x 이하)은 문제 없이 작동합니다. 최선의 전략을 위해 작업 환경 버전을 최신 버전으로 자주 테스트하고 업데이트해야 합니다. 이는 새로운 기능, 향상된 보안을 제공하며, 이 특정 경우에는 러너 호스트의 기본 Docker Engine 업그레이드를 작업에 대해 투명하게 만듭니다.

오류: failed to verify certificate: x509: certificate signed by unknown authority#

이 오류는 커스텀 또는 비공개 인증서(예: Zscaler 인증서)가 사용되는 Docker-in-Docker 환경에서 docker build 또는 docker pull과 같은 Docker 명령이 실행될 때 나타날 수 있습니다:

error pulling image configuration: download failed after attempts=6: tls: failed to verify certificate: x509: certificate signed by unknown authority

이 오류는 Docker-in-Docker 환경의 Docker 명령이 두 개의 별도 컨테이너를 사용하기 때문에 발생합니다:

  • 빌드 컨테이너: Docker 클라이언트(/usr/bin/docker)를 실행하고 작업의 스크립트 명령을 실행합니다.
  • 서비스 컨테이너 (종종 svc라고 함): 대부분의 Docker 명령을 처리하는 Docker 데몬을 실행합니다.

조직이 커스텀 인증서를 사용하는 경우 두 컨테이너 모두 이러한 인증서가 필요합니다. 두 컨테이너 모두에 적절한 인증서 구성이 없으면 외부 레지스트리나 서비스에 연결하는 Docker 작업이 인증서 오류로 실패합니다.

이 문제를 해결하려면:

  1. 루트 인증서를 CA_CERTIFICATE라는 CI/CD 변수로 저장합니다. 인증서는 다음 형식이어야 합니다:

    -----BEGIN CERTIFICATE-----
    (certificate content)
    -----END CERTIFICATE-----
    
  2. Docker 데몬을 시작하기 전에 서비스 컨테이너에 인증서를 설치하도록 파이프라인을 구성합니다. 예를 들어:

    image_build:
      stage: build
      image:
        name: docker:19.03
      variables:
        DOCKER_HOST: tcp://localhost:2375
        DOCKER_TLS_CERTDIR: ""
        CA_CERTIFICATE: "$CA_CERTIFICATE"
      services:
        - name: docker:19.03-dind
          command:
            - /bin/sh
            - -c
            - |
              echo "$CA_CERTIFICATE" > /usr/local/share/ca-certificates/custom-ca.crt && \
              update-ca-certificates && \
              dockerd-entrypoint.sh || exit
      script:
        - docker info
        - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD $DOCKER_REGISTRY
        - docker build -t "${DOCKER_REGISTRY}/my-app:${CI_COMMIT_REF_NAME}" .
        - docker push "${DOCKER_REGISTRY}/my-app:${CI_COMMIT_REF_NAME}"
    

Docker 빌드 문제 해결

원문 보기
요약

이 오류는 Docker-in-Docker v19.03 이상을 사용할 때 흔히 발생합니다: 이 오류는 Docker가 자동으로 TLS를 시작하기 때문에 발생합니다. 이 오류는 Docker-in-Docker 서비스가 완전히 시작되기 전에 접근을 시도할 때 Kubernetes executor에서도 발생할 수 있습니다.

오류: docker: Cannot connect to the Docker daemon at tcp://docker:2375#

이 오류는 Docker-in-Docker v19.03 이상을 사용할 때 흔히 발생합니다:

docker: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

이 오류는 Docker가 자동으로 TLS를 시작하기 때문에 발생합니다.

이 오류는 Docker-in-Docker 서비스가 완전히 시작되기 전에 접근을 시도할 때 Kubernetes executor에서도 발생할 수 있습니다. 자세한 설명은 이슈 27215를 참조하세요.

Docker no such host 오류#

docker: error during connect: Post https://docker:2376/v1.40/containers/create: dial tcp: lookup docker on x.x.x.x:53: no such host라는 오류가 발생할 수 있습니다.

이 문제는 서비스의 이미지 이름에 레지스트리 호스트 이름이 포함될 때 발생할 수 있습니다. 예를 들어:

default:
  image: docker:24.0.5-cli
  services:
    - registry.hub.docker.com/library/docker:24.0.5-dind

서비스의 호스트 이름은 전체 이미지 이름에서 파생됩니다. 그러나 더 짧은 서비스 호스트 이름 docker가 예상됩니다. 서비스 확인 및 접근을 허용하려면 서비스 이름 docker에 대한 명시적 별칭을 추가합니다:

default:
  image: docker:24.0.5-cli
  services:
    - name: registry.hub.docker.com/library/docker:24.0.5-dind
      alias: docker

오류: Cannot connect to the Docker daemon at unix:///var/run/docker.sock#

dind 서비스에 접근하기 위해 docker 명령을 실행하려고 할 때 다음 오류가 발생할 수 있습니다:

$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

작업에 다음 환경 변수가 정의되어 있는지 확인하세요:

  • DOCKER_HOST
  • DOCKER_TLS_CERTDIR (선택 사항)
  • DOCKER_TLS_VERIFY (선택 사항)

Docker 클라이언트를 제공하는 이미지를 업데이트할 수도 있습니다. 예를 들어, docker/compose 이미지는 더 이상 사용되지 않으며 docker로 교체해야 합니다.

러너 이슈 30944에 설명된 것처럼, 작업이 이전에 DOCKER_PORT_2375_TCP와 같이 더 이상 사용되지 않는 Docker --link 매개변수에서 파생된 환경 변수에 의존했던 경우 이 오류가 발생할 수 있습니다. 다음 조건이 충족되면 작업이 이 오류와 함께 실패합니다:

  • CI/CD 이미지가 DOCKER_PORT_2375_TCP와 같은 레거시 변수에 의존합니다.
  • 러너 기능 플래그 FF_NETWORK_PER_BUILDtrue로 설정되어 있습니다.
  • DOCKER_HOST가 명시적으로 설정되어 있지 않습니다.

오류: unauthorized: incorrect username or password#

이 오류는 더 이상 사용되지 않는 변수 CI_BUILD_TOKEN을 사용할 때 나타납니다:

Error response from daemon: Get "https://registry-1.docker.io/v2/": unauthorized: incorrect username or password

사용자가 이 오류를 받지 않도록 하려면:

  • 대신 CI_JOB_TOKEN을 사용합니다.
  • gitlab-ci-token/CI_BUILD_TOKEN에서 $CI_REGISTRY_USER/$CI_REGISTRY_PASSWORD로 변경합니다.

연결 오류: no such host#

이 오류는 dind 서비스가 시작에 실패했을 때 나타납니다:

error during connect: Post "https://docker:2376/v1.24/auth": dial tcp: lookup docker on 127.0.0.11:53: no such host

작업 로그에 mount: permission denied (are you root?)가 나타나는지 확인하세요. 예를 들어:

Service container logs:
2023-08-01T16:04:09.541703572Z Certificate request self-signature ok
2023-08-01T16:04:09.541770852Z subject=CN = docker:dind server
2023-08-01T16:04:09.556183222Z /certs/server/cert.pem: OK
2023-08-01T16:04:10.641128729Z Certificate request self-signature ok
2023-08-01T16:04:10.641173149Z subject=CN = docker:dind client
2023-08-01T16:04:10.656089908Z /certs/client/cert.pem: OK
2023-08-01T16:04:10.659571093Z ip: can't find device 'ip_tables'
2023-08-01T16:04:10.660872131Z modprobe: can't change directory to '/lib/modules': No such file or directory
2023-08-01T16:04:10.664620455Z mount: permission denied (are you root?)
2023-08-01T16:04:10.664692175Z Could not mount /sys/kernel/security.
2023-08-01T16:04:10.664703615Z AppArmor detection and --privileged mode might break.
2023-08-01T16:04:10.665952353Z mount: permission denied (are you root?)

이는 GitLab Runner가 dind 서비스를 시작할 권한이 없음을 나타냅니다:

  1. config.tomlprivileged = true가 설정되어 있는지 확인합니다.
  2. CI 작업에 이러한 권한 있는 러너를 사용할 올바른 러너 태그가 있는지 확인합니다.

오류: cgroups: cgroup mountpoint does not exist: unknown#

Docker Engine 20.10에서 도입된 알려진 비호환성이 있습니다.

호스트가 Docker Engine 20.10 이상을 사용하는 경우, 20.10보다 이전 버전의 docker:dind 서비스는 예상대로 작동하지 않습니다.

서비스 자체는 문제 없이 시작되지만, 컨테이너 이미지를 빌드하려고 하면 다음 오류가 발생합니다:

cgroups: cgroup mountpoint does not exist: unknown

이 문제를 해결하려면 docker:dind 컨테이너를 최소 20.10.x 버전(예: docker:24.0.5-dind)으로 업데이트합니다.

반대 구성(docker:24.0.5-dind 서비스 및 호스트의 Docker Engine 버전 19.06.x 이하)은 문제 없이 작동합니다. 최선의 전략을 위해 작업 환경 버전을 최신 버전으로 자주 테스트하고 업데이트해야 합니다. 이는 새로운 기능, 향상된 보안을 제공하며, 이 특정 경우에는 러너 호스트의 기본 Docker Engine 업그레이드를 작업에 대해 투명하게 만듭니다.

오류: failed to verify certificate: x509: certificate signed by unknown authority#

이 오류는 커스텀 또는 비공개 인증서(예: Zscaler 인증서)가 사용되는 Docker-in-Docker 환경에서 docker build 또는 docker pull과 같은 Docker 명령이 실행될 때 나타날 수 있습니다:

error pulling image configuration: download failed after attempts=6: tls: failed to verify certificate: x509: certificate signed by unknown authority

이 오류는 Docker-in-Docker 환경의 Docker 명령이 두 개의 별도 컨테이너를 사용하기 때문에 발생합니다:

  • 빌드 컨테이너: Docker 클라이언트(/usr/bin/docker)를 실행하고 작업의 스크립트 명령을 실행합니다.
  • 서비스 컨테이너 (종종 svc라고 함): 대부분의 Docker 명령을 처리하는 Docker 데몬을 실행합니다.

조직이 커스텀 인증서를 사용하는 경우 두 컨테이너 모두 이러한 인증서가 필요합니다. 두 컨테이너 모두에 적절한 인증서 구성이 없으면 외부 레지스트리나 서비스에 연결하는 Docker 작업이 인증서 오류로 실패합니다.

이 문제를 해결하려면:

  1. 루트 인증서를 CA_CERTIFICATE라는 CI/CD 변수로 저장합니다. 인증서는 다음 형식이어야 합니다:

    -----BEGIN CERTIFICATE-----
    (certificate content)
    -----END CERTIFICATE-----
    
  2. Docker 데몬을 시작하기 전에 서비스 컨테이너에 인증서를 설치하도록 파이프라인을 구성합니다. 예를 들어:

    image_build:
      stage: build
      image:
        name: docker:19.03
      variables:
        DOCKER_HOST: tcp://localhost:2375
        DOCKER_TLS_CERTDIR: ""
        CA_CERTIFICATE: "$CA_CERTIFICATE"
      services:
        - name: docker:19.03-dind
          command:
            - /bin/sh
            - -c
            - |
              echo "$CA_CERTIFICATE" > /usr/local/share/ca-certificates/custom-ca.crt && \
              update-ca-certificates && \
              dockerd-entrypoint.sh || exit
      script:
        - docker info
        - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD $DOCKER_REGISTRY
        - docker build -t "${DOCKER_REGISTRY}/my-app:${CI_COMMIT_REF_NAME}" .
        - docker push "${DOCKER_REGISTRY}/my-app:${CI_COMMIT_REF_NAME}"