首页 > 解决方案 > 尝试在 TeamCity 中构建和运行 Docker 容器时出错

问题描述

我想构建我的 Android Dockerfile 并在此构建步骤之后运行另一个步骤。

步骤很简单,构建 Docker 映像: 在此处输入图像描述

所以命令很简单:

docker build -t android-build:android-template -f Dockerfile .

我的 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 "$ANDROID_HOME" .android \
    && cd "$ANDROID_HOME" \
    && curl -o sdk.zip $SDK_URL \
    && unzip sdk.zip \
    && rm sdk.zip

RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --licenses

RUN $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME --update

RUN yes | $ANDROID_HOME/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_HOME \
    "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
    "platforms;android-${ANDROID_VERSION}"

RUN mkdir /application

WORKDIR /application

不幸的是,构建只是在这第一步失败: 在此处输入图像描述

整个错误日志如下:

 time="2020-07-18T22:01:27Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: no such file or directory"
00:01:27
  time="2020-07-18T22:01:27Z" level=error msg="Can't add file /opt/buildagent/work/da45177e2c517d09/.git/index to tar: io: read/write on closed pipe"
00:01:27
  time="2020-07-18T22:01:27Z" level=error msg="Can't close tar writer: io: read/write on closed pipe"
00:01:27
  error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=fvz9t2pm9dkmopc06bf6yxqa5&shmsize=0&t=android-build%3Aandroid-template&target=&ulimits=null&version=1: context canceled
00:01:27
  Process exited with code 1
00:01:28
  Process exited with code 1 (Step: Build a Docker container (Command Line))
00:01:28
  Step Build a Docker container (Command Line) failed

我正在运行这个 docker-compose 文件:

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

在 Mac 上:macOS Catalina 版本 10.15.5

我不是 DevOps 人,你能帮我解决这个问题吗?

标签: androiddockerdocker-composedockerfileteamcity

解决方案


这里发生了几件事。

首先,我认为您需要将主机安装/var/run/docker.sock到您的构建代理中。

从命令行,它看起来像这样:

docker run -e DOCKER_IN_DOCKER=start --privileged -v /var/run/docker.sock:/var/run/docker.sock -it jetbrains/teamcity-agent:2019.2.4 /bin/bash

所以在 docker compose 中,我猜你需要这样的东西:

  volumes:
     - /var/run/docker.sock:/var/run/docker.sock

其次,版本 2020.1发生了变化,不再以 root 身份运行。

自版本 2020.1 起,TeamCity 代理 Docker 映像在非 root 用户下运行。有关可能受影响的用例的信息,请参阅我们的升级说明。

因此,如果您使用 2020 版或更高版本的构建代理,您可能需要在 docker compose 中指定 root 用户才能使 docker 中的 docker 正常工作。因此,在 docker compose 中,我认为您会user: root在图像行下添加。


推荐阅读