【问题标题】:Teamcity Build won't run until Build Agents is configured with Docker?在使用 Docker 配置 Build Agents 之前,Teamcity Build 不会运行?
【发布时间】:2021-07-14 04:05:32
【问题描述】:

我为我的 Teamcity 管道创建了一个新版本。我第一次使用 Docker buildstep。设置完所有内容后,我意识到构建代理似乎还没有准备好。

我知道我的代理似乎还没有准备好使用 docker 进行构建但是实际上没有人告诉我如何做到这一点。我阅读了官方指南,但没有关于如何将 docker 实际安装到我的代理中的消息(如果这是解决问题的方法)。

谁能告诉我我必须做什么才能让它工作?

编辑

@Senior Pomidor 帮助我更进一步。我将他的第一个示例添加到 docker run 命令中

docker run -it -e SERVER_URL="<url to TeamCity server>"  \
    --privileged -e DOCKER_IN_DOCKER=start \    
    jetbrains/teamcity-agent 

这样做后,我删除了屏幕截图中提到的消息。我的代理配置现在具有以下内容:

docker.server.osType     linux
docker.server.version    18.06.1
docker.version   18.06.1

Teamcity 仍然抱怨这条消息:

这又让我一无所知。

最终解决方案: 只需重新启动 teamcity 服务器实例即可解决即将出现的 EDIT2 问题。代理实际上能够运行构建,但如果没有重新启动,teamcity 就无法意识到这一点。

EDIT2

请求信息:

我的 CI 服务器操作系统:

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"

运行容器:

CONTAINER ID        IMAGE                       COMMAND              CREATED             STATUS              PORTS                  NAMES
0f8e0b04d6a6        jetbrains/teamcity-agent    "/run-services.sh"   19 hours ago        Up 19 hours         9090/tcp               teamcity-agent
20964c22b2d9        jetbrains/teamcity-server   "/run-services.sh"   37 hours ago        Up 37 hours         0.0.0.0:80->8111/tcp   teamcity-server-instance

容器运行者:

## Server
docker run -dit --name teamcity-server-instance  -v /data/teamcity:/data/teamcity_server/datadir -v /var/log/teamcity:/opt/teamcity/logs  -p 80:8111 jetbrains/teamcity-server

## Agent
docker run -itd --name teamcity-agent -e SERVER_URL="XXX.XXX.XXX.XXX:80"  --privileged -e DOCKER_IN_DOCKER=start -v /etc/teamcity/agent/conf:/data/teamcity_agent/conf jetbrains/teamcity-agent

构建步骤信息:

【问题讨论】:

  • 因为代理在没有 docker 的情况下启动。你如何运行你的代理?您的代理是否作为 Docker 容器运行?
  • 是的,它确实作为容器运行。我想知道如何将 Docker 安装到其中。只需 exec 进入容器并 apt-get docker 还是什么?
  • 能否请您添加您的构建配置和运行 TA 的服务器的信息?我认为您的配置需要 Windows 服务器
  • @SeniorPomidor 添加了有关服务器和 ci 配置的信息
  • 能否请您打开您的代理-> 代理参数-> 配置参数-> 复制值docker.server.osType 并发送到这里?

标签: docker build continuous-integration teamcity


【解决方案1】:

TC 限制配置,因为 TA 没有启动 Docker 守护进程。

你应该通过-e DOCKER_IN_DOCKER=start 来自动启动容器中的 docker 守护进程。此外,docker daemon 需要 docker 套接字。在 Linux 容器中,如果您需要在构建中使用 Docker 守护程序,您有两种选择:

  • --privileged 标志。在您的容器中运行的新 Docker 守护进程
  • -v docker_volumes:/var/lib/docker 来自主机的 Docker(在这种情况下,您将受益于主机和所有容器之间共享的缓存,但存在安全问题:您的构建实际上可能会损害您的主机 Docker,因此使用它需要您自担风险)

在 Linux 容器中,如果您需要在构建中使用 Docker 守护程序,您有两种选择:

  1. 来自主机的 Docker(在这种情况下,您将受益于主机和所有容器之间共享的缓存,但存在安全问题:您的构建实际上可能会损害您的主机 Docker,因此使用它需要您自担风险)

例子

docker run -it -e SERVER_URL="<url to TeamCity server>"  \
    --privileged -e DOCKER_IN_DOCKER=start \    
    jetbrains/teamcity-agent 

docker run -it -e SERVER_URL="<url to TeamCity server>"  \
    -v /var/run/docker.sock:/var/run/docker.sock  \
    jetbrains/teamcity-agent 

更新

docker.server.osType 是必需的,因为在构建步骤中设置了linux

【讨论】:

  • 这确实有帮助,但仍有一些问题无法正常工作,请检查我在帖子中的编辑
【解决方案2】:

对我有用的是更改 /var/run/docker.sock 的代理容器的权限

在容器内运行一个 shell: docker exec -u 0 -it &lt;CONTAINER_ID&gt; bash

更改 docker 套接字的权限: chmod 666 /var/run/docker.sock

验证 docker 容器是否使用了套接字: docker version

【讨论】:

    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多