0

Trying to deploy a teamcity build agent on the Mesosphere Marathon platform and having problems with the port mappings.

By default the teamcity server will try to talk to the teamcity agent on port 9090

Therefor I set the container port like so :

"containerPort": 9090

However when I deploy the teamcity agent container, Marathon maps port 9090 to a port in the 30000 range.

When teamcity server talks back to the container on port 9090 it fails because the port is mapped to 30000.

I've figured out how to get this dynamic port into the teamcity config file by running the following sed command in the marathon args :

"args": ["sh", "-c", "sed -i -- \"s/ownPort=9090/ownPort=$PORT0/g\" buildAgent.properties; bin/agent.sh run"],

When the container is spun up it will swap out ownPort=9090 for ownPort=$PORT0 in buildAgent.properties and then start the agent.

However now that the agent is on port 30000 the "containerPort": 9090 is now invalid, it should be "containerPort": $PORT0 however this is invalid json as containerPort should be an integer.

I have tried setting "containerPort": 0 which should dynamically assign a port, but using this value I cannot get the container to start it just disappears straight away and keeps trying to deploy it.

I log onto the mesos slave host and run docker ps -a I can see the containers ports are blank :

CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                       PORTS                     NAMES
28*********0        teamcityagent            "\"sh -c 'sed -i --    7 minutes ago       Exited (137) 2 minutes ago                             mes************18a8

This is the Marathon json file I'm using and Marathon version is Version 0.8.2 :

{
    "id": "teamcityagent",
    "args": ["sh", "-c", "sed -i -- \"s/ownPort=9090/ownPort=$PORT0/g\" buildAgent.properties; bin/agent.sh run"],
    "cpus": 0.05,
    "mem": 4000.0,
    "instances": 1,
    "container": 
    {
        "type": "DOCKER",
        "docker": 
        {
            "image": "teamcityagent",
            "forcePullImage": true,
            "network": "BRIDGE",
            "portMappings": 
            [
                {
                    "containerPort": 0,
                    "hostPort": 0,
                    "servicePort": 0,
                    "protocol": "tcp"
                }
            ]
        }
    }

}

Any help would be greatly appreciated!

4

1 回答 1

0

从 Marathon 版本 0.8.2 升级到 Marathon 版本 0.9.0 修复了该问题,使用设置“containerPort”:0,现在可以正确动态设置端口并且容器启动并且 teamcity 服务器现在可以与其通信。

于 2015-07-16T23:05:53.203 回答