GitLab CI公共Runner构建Docker镜像失败,遇DNS解析错误求助
GitLab CI构建镜像推GCR遇docker主机解析失败的解决方案
问题详情
使用GitLab公共Runner(版本15.7.1)搭建CI流水线,构建镜像并推送至Google容器仓库(GCR)时,出现以下错误:
ERROR: error during connect: Get "http://docker:2375/v1.24/info": dial tcp: lookup docker on 169.254.169.254:53: no such host
当前CI脚本如下:
image: docker:latest variables: GCR_IMAGE: <GCR_IMAGE> services: - docker:dind build: stage: build before_script: - docker info - echo $GOOGLE_CLOUD_ACCOUNT | docker login -u _json_key --password-stdin https://us.gcr.io script: - docker build -t $GCR_IMAGE:latest . - docker push $GCR_IMAGE:$CI_COMMIT_SHA
针对公共Runner的可行解决方案
1. 匹配Docker镜像版本并启用TLS配置
新版docker:dind默认启用TLS加密,公共Runner的网络解析或权限限制可能导致无TLS连接失败。需同步主镜像和服务镜像版本,并添加TLS相关环境变量:
image: docker:24.0.6 variables: GCR_IMAGE: <GCR_IMAGE> # 启用TLS并指定证书目录 DOCKER_TLS_CERTDIR: "/certs" # 指定TLS连接地址 DOCKER_HOST: "tcp://docker:2376" services: - docker:dind:24.0.6 build: stage: build before_script: - docker info - echo $GOOGLE_CLOUD_ACCOUNT | docker login -u _json_key --password-stdin https://us.gcr.io script: - docker build -t $GCR_IMAGE:latest . - docker push $GCR_IMAGE:$CI_COMMIT_SHA
2. 使用Kaniko替代Docker-in-Docker
公共Runner通常对docker:dind有严格的权限和网络限制,Kaniko是无守护进程的镜像构建工具,无需依赖Docker daemon,更适合公共环境:
image: gcr.io/kaniko-project/executor:debug variables: GCR_IMAGE: <GCR_IMAGE> # Kaniko配置文件路径 KANIKO_CONFIG: /kaniko/.docker/config.json build: stage: build before_script: # 生成GCR登录配置 - echo "{\"auths\":{\"us.gcr.io\":{\"auth\":\"$(echo -n _json_key:$(echo "$GOOGLE_CLOUD_ACCOUNT") | base64)\"}}}" > $KANIKO_CONFIG script: # 构建并推送镜像 - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $GCR_IMAGE:latest --destination $GCR_IMAGE:$CI_COMMIT_SHA
3. 检查公共Runner的可用服务限制
部分GitLab公共Runner池可能禁用了docker:dind服务,可尝试切换至其他公共Runner池,或确认当前池的服务权限配置。
内容的提问来源于stack exchange,提问作者Ayush Pallav
相关产品推荐
相关产品推荐

