Search code examples
dockerteamcitymesosmesospheremarathon

Setting Team City Build Agent Port Number in Marathon


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!


Solution

  • Upgrading from Marathon Version 0.8.2 to Marathon Version 0.9.0 fixed the issue, using settings "containerPort": 0, now dynamically sets a port properly and the container starts up and the teamcity server can now communicate with it.