Как подключить Flyway, работающий в контейнере Docker, к базе данных, работающей в контейнере Docker?

#sql-server #docker #flyway

#sql-server #docker #flyway

Вопрос:

Мы используем Microsoft SQL Server в качестве базы данных и Flyway для управления ею. Теперь я хотел бы протестировать сценарии Flyway, запустив SQL Server в Docker и Flyway в моем собственном контейнере Docker, который содержит всю конфигурацию и все сценарии базы данных Flyway (миграции).

Насколько я знаю, невозможно использовать переменные среды в файлах конфигурации Flyway. В идеале это было бы возможно:

 flyway.url=jdbc:sqlserver://${MSSQL_SERVICE_HOST}:${MSSQL_SERVICE_PORT};databaseName=testing_pp
flyway.user=testing_pp
flyway.password=${MSSQL_SERVICE_PASSWORD}
  

На самом деле, мне нужно знать наилучшую стратегию как для автономного Docker, так и для OpenShift. Я довольно новичок в обоих…

Есть ли способ ввести IP-адрес и порт из одного запущенного контейнера Docker в другой? Тот, который не включает Docker Compose? И каков был бы правильный способ сделать это в OpenShift? Я знаю, что тамошние модули получают хосты и порты от всех запущенных модулей в качестве переменных среды (см. Мое гипотетическое решение). Но эти переменные не разрешены, это не решает мою проблему.

Как вы проводите такие тесты?

Ответ №1:

Если я вас правильно понял, вопрос заключается в том, как подключить два контейнера docker без docker-compose . На самом деле docker-compose это мало что добавляет в этих терминах — это просто автоматизирует несколько шагов.

Для подключения контейнеров необходимо:

  1. Создайте новую пользовательскую мостовую сеть (сделано один раз): docker network create foo

  2. Подключите оба контейнера к этой сети с --network=foo опцией запуска

  3. Укажите имена контейнеров вместо автоматически созданных с помощью --name=xyz

  4. Используйте эти имена вместо IP-адресов в строках подключения.

     docker network create foo
    docker run -d --rm --name=my-database --network=foo <SQLServerImageName>
    docker run -d --rm --name=my-flyway --network=foo <FlyWayImageName>
      

Теперь вы можете подключиться из Flyway к SQL с server=my-database

Комментарии:

1. Спасибо, это решает одну часть уравнения. Другой способ — ввести это имя в Flyway с помощью переменной окружения.

2. docker run -d --rm -e "SQL_SERVER=my-database" --name=my-flyway --network=foo <FlyWayImageName>

3. Извините, что заставил вас ждать… Я протестировал все с помощью сценария оболочки. Похоже, что Flyway (который я не запускаю в отключенном режиме, поскольку это одноразовая вещь) не видит сеть: ошибка Flyway Community Edition 5.0.7 от Boxfuse: не удается получить соединение из базы данных (jdbc: sqlserver://flyway: 1433;DatabaseName=etrademark) для пользователя ‘etrademark’: соединение TCP / IP с хостом flyway, порт 1433 имеет потерпел неудачу. Ошибка: «flyway. Проверьте свойства подключения. Убедитесь, что экземпляр SQL Server запущен на хосте и принимает соединения TCP / IP через порт.»

4. Вы знаете, как я мог бы проверить, известно ли контейнеру доменное имя?

5. Моя ошибка заключалась в том, что я использовал сетевое имя в качестве имени домена для подключения. Мне нужно использовать имя Docker, в данном случае my-database в моей строке подключения JDBC.