在TeamCity中构建运行Docker容器失败的问题求助
我帮你分析下问题根源:你在macOS Catalina上用TeamCity的Docker-in-Docker(DinD)Agent构建Android镜像时,错误提示无法连接Docker daemon,这主要是因为macOS上的Docker Desktop运行机制和Linux不同,加上你的Agent容器配置缺少关键的Socket挂载,导致容器内的Docker客户端找不到宿主的daemon。
下面是一步步的解决步骤:
1. 修正TeamCity Agent的Docker Socket挂载
macOS上的Docker Daemon通过socket文件/var/run/docker.sock对外提供服务,你需要把这个宿主的socket挂载到Agent容器内,这样容器里的Docker客户端才能和宿主的Daemon通信。同时调整Agent配置目录的挂载路径(避免macOS上的权限问题):
修改你的docker-compose.yaml为以下内容:
version: "3.1" services: tcs: image: jetbrains/teamcity-server container_name: teamcity-server ports: - "8111:8111" volumes: - teamcity/server/data:/data/teamcity_server/datadir - teamcity/server/logs:/opt/teamcity/logs tca: image: jetbrains/teamcity-agent depends_on: - tcs container_name: teamcity-agent environment: - DOCKER_IN_DOCKER=start - SERVER_URL=http://tcs:8111/ privileged: true volumes: - ./teamcity/agent:/data/teamcity_agent/conf - /var/run/docker.sock:/var/run/docker.sock
注意:先在本地创建
./teamcity/agent目录,避免挂载时出现权限错误。
2. 开启Docker Desktop的容器Socket访问权限
在macOS上打开Docker Desktop,进入偏好设置:
- 切换到General标签页
- 勾选
Allow the default Docker socket to be used by containers选项 - 点击Apply & Restart重启Docker Desktop
3. 验证Agent容器内的Docker连接
重启TeamCity Agent容器后,进入容器内部验证Docker是否能正常工作:
# 进入Agent容器 docker exec -it teamcity-agent bash # 测试Docker连接 docker ps
如果能列出当前运行的容器(包括TeamCity Server),说明连接已经正常。
4. 优化你的Android Dockerfile(可选但推荐)
你的原始Dockerfile存在两个小问题:一是多RUN命令会增加镜像层数,二是新版Android命令行工具的目录结构需要调整,否则sdkmanager可能无法正常识别。优化后的Dockerfile如下:
FROM openjdk:11.0.7 ENV SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-6604631_latest.zip" \ ANDROID_HOME="/usr/local/android-sdk" \ ANDROID_VERSION=29 \ ANDROID_BUILD_TOOLS_VERSION=28.0.3 RUN mkdir -p "$ANDROID_HOME/cmdline-tools" \ && cd "$ANDROID_HOME/cmdline-tools" \ && curl -o sdk.zip $SDK_URL \ && unzip sdk.zip \ && mv cmdline-tools latest \ && rm sdk.zip \ && yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses \ && $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_HOME --update \ && yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --sdk_root=$ANDROID_HOME \ "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \ "platforms;android-${ANDROID_VERSION}" RUN mkdir /application WORKDIR /application
这里合并了多个RUN命令减少镜像层数,同时修正了cmdline-tools的目录结构(将解压后的cmdline-tools目录重命名为latest,符合Android SDK的目录规范)。
完成以上步骤后,重新执行你的Docker构建命令,应该就能成功构建Android镜像了。
内容的提问来源于stack exchange,提问作者K.Os

