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

在TeamCity中构建运行Docker容器失败的问题求助

解决TeamCity Agent(Docker-in-Docker)构建Android镜像时无法连接Docker Daemon的问题

我帮你分析下问题根源:你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:12:46