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 executor와 Docker 이미지 사용을 참조하세요.
- v18.09 이하에서 업그레이드하는 경우 업그레이드 가이드를 참조하세요.
이 오류는 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_HOSTDOCKER_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_BUILD가true로 설정되어 있습니다. 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 서비스를 시작할 권한이 없음을 나타냅니다:
config.toml에privileged = true가 설정되어 있는지 확인합니다.- 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 작업이 인증서 오류로 실패합니다.
이 문제를 해결하려면:
-
루트 인증서를
CA_CERTIFICATE라는 CI/CD 변수로 저장합니다. 인증서는 다음 형식이어야 합니다:-----BEGIN CERTIFICATE----- (certificate content) -----END CERTIFICATE----- -
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}"
