Java сборка приложения завершается неудачно с Mysql URL-адресом, указывающим на Docker контейнер - PullRequest
1 голос
/ 22 февраля 2020

У меня есть приложение Java, которое необходимо подключить к MySQL.

При предоставлении url: jdbc:mysql://localhost:3306/<dbname> Я могу построить Кувшин. Однако я хочу запустить его на контейнере Docker в сети, где у меня также есть контейнер MySQL с именем mysqlindocker. Чтобы создать Jar, я ввел URL как jdbc:mysql://mysqlindocker:3306/<dbname>, который, я надеюсь, будет работать при запуске внутри контейнера Но я не могу этого сделать, потому что сборка не удалась. Я предполагаю, что Spring на моей локальной машине не может указывать на этот URL-адрес БД.

Как создать банку с URL-адресом как jdbc:mysql://mysqlindocker:3306/<dbname>?

PS Я бы не предпочел указывать на MySQL, работающий на локальном хосте.

1 Ответ

1 голос
/ 22 февраля 2020

Я создаю флягу, используя mvn clean install. Сбой на @Test void contextLoads (). Если я это прокомментирую, то смогу создать jar с указателем db url на мой> docker контейнер

В рамках модульных тестов, выполненных на этапе test в maven, mysqlindocker имя хоста не может быть разрешено:

jdbc:mysql://mysqlindocker:3306/<dbname>

Это разрешат только контейнеры в одной сети docker.
И так как эти тесты выполняются вне контейнера (прежде чем начать его, чтобы быть точным ), они не могут получить доступ к этой сети.

Как это решить?

1) Устранение root причины

Фактически, root причина вашей ошибки сборки во время выполнения модульного теста заключается в том, что вы не определили jdb c url в соответствии с целевой областью действия.
Действительно, на этапе test сборки maven обычно требуется, чтобы тесты использовали базу данных в памяти или указанную базу данных c MySQL. Вы не хотите использовать тот же, который использовался для основного приложения по согласованным причинам (проверка воспроизводимости). В данном случае рекомендуется использовать другой экземпляр базы данных для модульного тестирования, и эта база данных должна быть доступна с хоста, на котором выполняется сборка (localhost).
Вы можете переопределить свойство spring.datasource.url для выполненных тестов: либо определив application-test.properties/yml файл в src/test/resources или переопределение свойства непосредственно в тестовом классе @SpringBootTest(properties=...).

2) Обходной путь

Обратите внимание, что если порт контейнера MySQL дБ публикуется на хосте, на котором выполняется сборка, (временным) обходным решением будет сохранение localhost в определенном URL в spring.datasource.url для сборки и переопределить его именем контейнера docker во время выполнения, когда вы запускаете JAR в качестве конечной точки контейнера:

java -jar myApp.jar --spring.config.location=jdbc:mysql://mysqlindocker:3306/dbname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...