非特权模式下Docker-in-Docker连接Docker守护进程问题(BitBucket Pipeline)
BitBucket Pipelines Docker-in-Docker 主机解析错误解决方案
错误原因
你遇到的dial tcp: lookup docker on 100.100.2.136:53: no such host错误,本质是BitBucket Pipelines的step容器无法解析dind服务容器的主机名,加上Atlassian不支持特权模式,常规GitLab CI的dind配置无法直接复用。
解决方案1:直接使用自托管Runner的本地Docker守护进程(推荐)
自托管Runner本身运行在你的服务器上,完全可以直接调用本地的Docker守护进程,不需要额外启动dind服务,既规避了网络解析问题,也无需特权模式。
修改后的bitbucket-pipelines.yml
pipelines: default: - step: name: 'Login' runs-on: - 'self.hosted' script: # 指向本地Docker套接字 - export DOCKER_HOST=unix:///var/run/docker.sock - echo $ACR_REGISTRY_PASSWORD | docker login -u $ACR_REGISTRY_USERNAME registry-intl.ap-southeast-1.aliyuncs.com --password-stdin - step: name: 'Build' runs-on: - 'self.hosted' script: - export DOCKER_HOST=unix:///var/run/docker.sock - docker build -t $ACR_REGISTRY:latest . # 替换原awk命令,直接使用已构建的镜像标签,更可靠 - docker tag $ACR_REGISTRY:latest $ACR_REGISTRY:$CI_PIPELINE_ID - docker push $ACR_REGISTRY:$CI_PIPELINE_ID
前置检查
确保自托管Runner的运行用户(默认是bitbucket-runner)已加入docker用户组,拥有访问/var/run/docker.sock的权限:
sudo usermod -aG docker bitbucket-runner
解决方案2:适配BitBucket Pipelines的Dind配置(不推荐)
若坚持使用dind服务,需手动配置网络解析和Docker守护进程参数,但因缺少特权模式,dind运行可能不稳定:
修改bitbucket-pipelines.yml
definitions: services: docker: image: docker:23.0.0-dind # 关闭TLS,使用明文TCP端口 environment: - DOCKER_TLS_CERTDIR= # 指定dockerd监听所有IP的2375端口 command: ["dockerd", "-H", "tcp://0.0.0.0:2375"] pipelines: default: - step: name: 'Login' runs-on: - 'self.hosted' services: - docker script: # 手动获取dind容器的IP并设置DOCKER_HOST - export DOCKER_HOST=$(getent hosts docker | awk '{print $1}'):2375 - echo $ACR_REGISTRY_PASSWORD | docker login -u $ACR_REGISTRY_USERNAME registry-intl.ap-southeast-1.aliyuncs.com --password-stdin - step: name: 'Build' runs-on: - 'self.hosted' services: - docker script: - export DOCKER_HOST=$(getent hosts docker | awk '{print $1}'):2375 - docker build -t $ACR_REGISTRY:latest . - docker tag $ACR_REGISTRY:latest $ACR_REGISTRY:$CI_PIPELINE_ID - docker push $ACR_REGISTRY:$CI_PIPELINE_ID
额外优化建议
你的Dockerfile存在两处可优化的问题:
- 安装Git方式错误:
npm install git安装的是JavaScript版本的Git库,不是系统Git工具,应替换为:RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* - CMD命令逻辑错误:
npm run dev与node build/server.ts不能同时作为命令参数,需二选一,比如:CMD ["node", "build/server.ts"] # 或如果package.json的dev脚本已配置启动命令: # CMD ["npm", "run", "dev"]
内容的提问来源于stack exchange,提问作者louis kaisian
相关产品推荐
相关产品推荐

