Я не знаю, является ли это «лучше», чем у вас в настоящее время, но я всегда подхожу к этому, думая, что у меня есть два развертывания, чтобы завершить мое приложение. У меня есть:
- Развертывание базы данных (которая включает в себя обновление схемы до последней версии, используя что-то вроде LiquiBase)
- развертывания приложения (который включает в себя развертывание последней версии моей WAR архива или однако он упакован)
Естественно, второе развертывание зависит от завершения и успешного завершения 1-го развертывания.
Итак, как мне смоделировать это с помощью докеров?Я все для ясности, поэтому я создаю два файла:
- докер-compose.database
- докер-compose.application
Я тогда процесс развертывания два шага:
Шаг 1:
docker-compose -p application-name -f docker-compose.database up -d database
docker-compose -p application-name -f docker-compose.database run --rm database-migration
Во-первых, мы начинаем - используя базу данных, используя docker-compose up
. Во-вторых, мы запускаем миграцию базы данных.
Как вы отметите в своем вопросе, будет зависеть, что база данных будет «готова» после того, как docker-compose up
вернется, поэтому логика миграции базы данных завернута в функцию проверки базы данных, которая запускает миграцию только после того, счастлив, что база данных доступна. Вы заметите, что я вызываю контейнер миграции базы данных с опцией --rm
, что означает, что контейнер автоматически удаляется после завершения выполнения. Не нужно держать этот контейнер висеть, как только он выполнил свою работу.
Здесь также важно использовать опцию -p
, предлагающую предложения для докеров. Это определяет project name
для развертывания и гарантирует, что все контейнеры создаются на одном и том же docker network
, что означает, что межконтейнерная связь по имени службы не является проблемой.
Шаг 2:
docker-compose -p application-name -f docker-compose.database -f docker-compose.application up -d application
Docker Compose позволяет указать несколько файлов в составлении в командной строке, и это то, что я здесь делаю. В моем docker-compose.application
файле у меня будет что-то вроде этого:
version: 2
services:
application:
image: my-tomcat-image
depends_on: database
Служба базы данных определяется в файле docker-compose.database
, и я знаю, что он сейчас уже работает (потому что шаг развертывания 1 полностью успешно). Поэтому я могу немедленно запустить сервис Tomcat, не ожидая чего-либо. Это помогает, поскольку у меня есть только «ожидание готовности базы данных к логике» в одном месте, то есть миграции базы данных. Сама служба Tomcat ожидает, что база данных будет там, а если нет, быстро сработает.
обертка вокруг шагов
Очевидным недостатком такого подхода является то, что вдруг больше, чем одна команда, необходимые для запуска развертывания. Это вызов, который всегда поднимает голову, когда вы пытаетесь сделать какую-либо конфигурацию инфраструктуры таким образом, где есть зависимости между службами.
Снова вы можете сохранить все просто, возможно, написав простой сценарий оболочки, чтобы обернуть команды команды docker-compose. Мне нравится уметь тестировать любые скрипты-оболочки, поэтому я обычно использую ruby для чего-то подобного. Вы могли бы представить себе что-то вроде:
ruby deploy.rb
deploy.rb сценария конечно подведения вашей многочисленной docker-compose
команды.
Другие подходящие подходы - это такие вещи, как использование Jenkins или любых других инструментов конвейера CI/CD, чтобы сделать это за вас (учитывая, что вы можете сделать это на своей локальной машине).
Вы также можете начать поиск таких инструментов, как Terraform, которые обеспечивают «стандартизированный» подход для выполнения подобных действий, но это может быть чрезмерно убито для того, что вам нужно, когда простой сценарий-обертка может заставить вас работать и работать.
Hi Rob. Спасибо за понимание! Я реорганизовал решение на основе вашего ответа, и мне он нравится (хотя решение более тяжелое для использования сокета-докера). Я также завернул его в сценарий оболочки и обычно выполнял его от Teamcity против Azure infra. Я посмотрю на Terraform, спасибо. Не могли бы вы также дать небольшое обновление относительно тестов на рубиновый блок? Как выглядит тест? –