You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:37:02