android - 尝试在 TeamCity 中构建和运行 Docker 容器时出错
问题描述
我想构建我的 Android Dockerfile 并在此构建步骤之后运行另一个步骤。
所以命令很简单:
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 人,你能帮我解决这个问题吗?
解决方案
这里发生了几件事。
首先,我认为您需要将主机安装/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
在图像行下添加。
推荐阅读
- spring-boot - 为什么我无法使用 springboot 应用程序启动 Thymeleaf 模板?
- javascript - D3 工具提示未出现在鼠标附近
- angular - HTMLCanvasElement 与 BrowserAnimationModule
- sql - row_number 函数的计算列公式
- powershell - 使用 Powershell 在特定 OU 中的单个列表中显示 AD 用户密码过期日期和密码已过期的用户?
- python - 我可以从这个用 Python 编写的机器学习脚本改变什么?我需要填写我丢失的降雨数据
- google-coral - 如何关闭 Google Coral 开发板上的 USB/以太网/HDMI/LED
- javascript - 这个“if”JavaScript 语句有什么问题?
- javascript - 如何使用 firestore 检查 id 是否已存在于 React 中?
- c# - 在 github 页面上尝试使用 github 操作部署 Blazor(操作失败,并显示“ENOENT:没有这样的文件或目录,scandir)