Я сделал чуть по проще (с меньшим кол-вом ручных действий).
Имеем:
- c#
- Stateless-приложения
- сервер с монгодб (ее не дают увести в докер).
- TeamCity.
Что сделал:
- Собрал билд-агента под mono в докер-контейнере, прокинул туда хостовый докер.
- Собрал базовый рантайм-контейнер с mono.
- Настроил билд через билд агента из п.1, при этом сам тимсити генерит Dockerfile (для c# они типовые).
- Поднял приватный докер registry.
- после этого тимсити делает docker tag, docker push в приватный репозитарий.
- на машинках кластера стоит watchtower, который обновляет и перезапускает контейнеры при появлении апдейта (но первый запуск нового сервиса делаю ручками).
- в самих проектах в гите храню compose файлы со ссылками на другие сервисы\контейнеры\env (с ними пока нет большого понимания - как и куда их правильно деплоить, где хранить - пока валяются в /home/ на каждой машинке в кластере).