在使用Docker配置Build Agents之前,Teamcity Build不会运行?

时间:2019-04-11 11:08:05

标签: docker build continuous-integration teamcity

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

enter image description here

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

有人可以告诉我要使其正常工作必须做什么吗?

编辑

@高级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仍在抱怨此消息:

enter image description here

还有点让我一无所知。

最终解决方案: 只需重新启动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

构建步骤信息:

enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

TC限制了配置,因为TA无法启动Docker守护程序。

您应通过-e DOCKER_IN_DOCKER=start来自动启动容器中的docker守护程序。另外,docker守护进程需要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 

UDP

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

答案 1 :(得分:1)

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

在容器内运行外壳程序: docker exec -u 0 -it <CONTAINER_ID> bash

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

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