Mesosphere Marathon プラットフォームに teamcity ビルド エージェントをデプロイしようとしていて、ポート マッピングに問題があります。
デフォルトでは、teamcity サーバーはポート 9090 で teamcity エージェントと通信しようとします。
そのため、コンテナ ポートを次のように設定します。
「コンテナ ポート」: 9090
ただし、teamcity エージェント コンテナーをデプロイすると、Marathon はポート 9090 を 30000 の範囲のポートにマップします。
teamcity サーバーがポート 9090 でコンテナーに戻ると、ポートが 30000 にマップされているため失敗します。
marathon args で次の sed コマンドを実行して、この動的ポートを teamcity 構成ファイルに取り込む方法を見つけました。
"args": ["sh", "-c", "sed -i -- \"s/ownPort=9090/ownPort=$PORT0/g\" buildAgent.properties; bin/agent.sh run"],
コンテナーがスピンアップすると、buildAgent.properties で ownPort=9090 が ownPort=$PORT0 に置き換えられ、エージェントが開始されます。
ただし、エージェントがポート 30000 にあるため、"containerPort": 9090 は無効になりました。"containerPort": $PORT0 である必要がありますが、containerPort は整数である必要があるため、これは無効な json です。
ポートを動的に割り当てる必要がある "containerPort": 0 を設定しようとしましたが、この値を使用するとコンテナーを起動できず、すぐに消えてデプロイを試み続けます。
mesos スレーブ ホストにログオンして docker ps -a を実行すると、コンテナーのポートが空白になっていることがわかります。
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
これは私が使用している Marathon json ファイルで、Marathon のバージョンは 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"
}
]
}
}
}
どんな助けでも大歓迎です!