GitLab CI/CD+Docker Compose部署AWS ECR失败问题排查
问题:GitLab CI/CD流水线Docker登录失败报错"dial tcp: lookup docker on 8.8.8.8:53: no such host"
我正尝试搭建GitLab CI/CD流水线,通过Docker Compose将Python应用与Weaviate数据库部署至AWS,但执行过程中出现问题。以下是我的.gitlab-ci.yml文件:
variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" stages: - build - deploy build: stage: build image: name: docker:latest services: - name: docker:23.0.1-dind alias: docker before_script: - apk add --no-cache curl jq python3 py3-pip - pip install awscli - aws ecr get-login-password | docker login --username AWS --password-stdin ${DOCKER_REGISTRY} - aws --version - docker info - docker --version - docker-compose --version script: - echo "IMAGE_APP_TAG=${DOCKER_REGISTRY}/${APP_NAME}:${CI_PIPELINE_ID}" >> .env - echo "COLLECTION_NAME=${COLLECTION_NAME}" >> .env - docker-compose build - docker-compose push ${DOCKER_REGISTRY}/${APP_NAME}:${CI_PIPELINE_ID} only: - create-ci-cd-pipeline deploy: stage: deploy script: - echo ${REPOSITORY_URL}:${IMAGE_TAG} - TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "${TASK_DEFINITION_NAME}" --region "${AWS_DEFAULT_REGION}") - NEW_CONTAINER_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE "${REPOSITORY_URL}:${IMAGE_TAG}" '.taskDefinition.containerDefinitions[0].image = $IMAGE | .taskDefinition.containerDefinitions[0]') - echo "Registering new container definition..." - NEW_TASK_DEFINITION=$(aws ecs register-task-definition --region "${AWS_DEFAULT_REGION}" --family "${TASK_DEFINITION_NAME}" --container-definitions "${NEW_CONTAINER_DEFINITION}") - echo "Updating the service..." - aws ecs update-service --region "${AWS_DEFAULT_REGION}" --cluster "${CLUSTER_NAME}" --service "${SERVICE_NAME}" --task-definition $(echo $NEW_TASK_DEFINITION | jq -r '.taskDefinition.taskDefinitionArn') only: - web
Python应用与Weaviate数据库在Docker Compose文件中定义为服务。流水线在执行以下步骤时失败:
aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
错误信息如下:
error during connect: Post "http://docker:2375/v1.24/auth": dial tcp: lookup docker on 8.8.8.8:53: no such host
问题成因
- DinD服务解析异常:GitLab CI作业容器无法解析
docker别名对应的DinD服务IP,导致无法连接Docker守护进程。 - 服务别名配置失效:虽指定了
alias: docker,但受GitLab Runner版本或网络配置影响,别名未正确生效。 - 版本兼容性问题:
docker:latest主镜像与docker:23.0.1-dind服务镜像版本差异过大,引发通信兼容性问题。 - TLS配置残留:虽设置
DOCKER_TLS_CERTDIR: ""禁用TLS,但可能存在环境变量残留,导致连接方式异常。
解决方法
1. 调整服务别名与DOCKER_HOST配置
移除自定义别名,使用GitLab默认服务名,修改DOCKER_HOST变量:
variables: DOCKER_HOST: tcp://docker:2375 # 其他变量不变 build: services: - name: docker:23.0.1-dind # 移除alias配置
或修改别名与对应DOCKER_HOST:
variables: DOCKER_HOST: tcp://docker:dind:2375 build: services: - name: docker:23.0.1-dind alias: docker:dind
2. 统一Docker版本
将主镜像与DinD服务版本保持一致,避免兼容性问题:
build: image: name: docker:23.0.1 services: - name: docker:23.0.1-dind
3. 提前验证Docker连接
在before_script中添加等待Docker守护进程就绪的逻辑:
before_script: - apk add --no-cache curl jq python3 py3-pip - pip install awscli # 等待Docker守护进程启动完成 - until docker info; do sleep 3; echo "Waiting for Docker daemon..."; done - aws ecr get-login-password | docker login --username AWS --password-stdin ${DOCKER_REGISTRY} # 其他命令不变
4. 检查GitLab Runner网络模式
确保Runner使用默认bridge网络模式,若自定义网络,需保证作业容器与DinD服务处于同一网络,可互相解析。
5. 尝试启用TLS模式(可选)
若禁用TLS出现问题,切换为TLS配置:
variables: DOCKER_TLS_CERTDIR: "/certs" DOCKER_HOST: tcp://docker:2376
内容的提问来源于stack exchange,提问作者Horseman
相关产品推荐
相关产品推荐

