Docker compose spring boot не может подключиться к базе данных mysql - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть весеннее загрузочное приложение, которое подключается к базе данных mysql.Если я запускаю его локально классическим способом, он работает нормально.Но когда я пытаюсь сделать dockerise это - база данных запускается успешно, но приложение не видит БД.

Мой Dockerfile:

FROM openjdk:11-jdk-slim
ADD start-local.sh /start-local.sh
RUN chmod +x start-local.sh
ENTRYPOINT [ "sh", "-c", "./start-local.sh" ]

Мой start-local.sh (я добавил его, чтобы мое приложение ожидало запуска базы данных):

#!/bin/sh

echo "Waiting for the database server to start"
echo "********************************************************"
apt-get update && apt-get install -y netcat
while ! nc -z mysql 3306; do sleep 3; done
echo "******** Database Server has started"
echo "Starting account service"
java -jar /mnt/service-2.4.0.jar

И, наконец, мойФайл docker-compose.yml:

version: '2'
services:
  mysql:
    image: mysql:5.7.23
    environment:
      - MYSQL_ROOT_PASSWORD=root
    entrypoint:
      sh -c "echo 'CREATE DATABASE IF NOT EXISTS books;  CREATE DATABASE IF NOT EXISTS notifications' > /docker-entrypoint-initdb.d/init.sql;/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --sql_mode="""
    ports:
      - "3306:3306"

  account_app:
    image: service_img
    environment:
      - "SPRING_PROFILES_ACTIVE=local"
    ports:
      - "8083:8083"
    volumes:
      - "/build/libs/:/mnt"

Что я выполняю:

  • Прежде всего, я создаю свой service_img
  • , затем выполняю docker-compose up,В журналах я вижу журналы запуска базы данных, после журналов запуска моего приложения и ошибки:

|2019-09-23 09: 51: 14.006 DEBUG [account-service ,,,] 286 --- [
main] cmlccdpDatasourceConfiguration: создание источника данных
account_app_1 |2019-09-23 09: 51: 14.014 ИНФО [account-service ,,,] 286 --- [main] com.zaxxer.hikari.HikariDataSource: HikariPool-1 - Starting ... account_app_1 |2019-09-23 09: 51: 15.222 ОШИБКА [account-service ,,,] 286 --- [main] com.zaxxer.hikari.pool.HikariPool: HikariPool-1 - исключение при инициализации пула.account_app_1 |account_app_1 |com.mysql.cj.jdbc.exceptions.CommunicationsException: сбой линии связи account_app_1 |account_app_1 |Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад.Драйвер не получил никаких пакетов с сервера.account_app_1 |в com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException (SQLError.java:174) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException (SQLExceptionsMapping.java:64) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:835) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl. (ConnectionImpl.java:455) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:240) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |at com.mysql.cj.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:199) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] Последний пакет, успешно отправленный на сервер, был 0 миллисекундтому назад.Драйвер не получил никаких пакетов с сервера.account_app_1 |в com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException (SQLError.java:174) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException (SQLExceptionsMapping.java:64) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:835) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl. (ConnectionImpl.java:455) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:240) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:199) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |на com.zaxxer.hikari.util.DriverDataSource.getConnection (DriverDataSource.java:136) ~ [HikariCP-3.2.0.jar! /: na] account_app_1 |at com.zaxxer.hikari.pool.PoolBase.newConnection (PoolBase.java:369) ~ [HikariCP-3.2.0.jar! /: na] account_app_1 |at com.zaxxer.hikari.pool.PoolBase.newPoolEntry (PoolBase.java:198) ~ [HikariCP-3.2.0.jar! /: na] account_app_1 |в com.zaxxer.hikari.pool.HikariPool.createPoolEntry (HikariPool.java:467)~ [HikariCP-3.2.0.jar! /: Na] account_app_1 |at com.zaxxer.hikari.pool.HikariPool.checkFailFast (HikariPool.java:541) ~ [HikariCP-3.2.0.jar! /: na] account_app_1 |... 206 общих кадров опущено account_app_1 |Вызывается: com.mysql.cj.exceptions.CJCommunicationsException: сбой линии связи account_app_1 |account_app_1 |Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад.Драйвер не получил никаких пакетов с сервера.account_app_1 |в java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) ~ [na: na] account_app_1 |в java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) ~ [na: na] account_app_1 |в java.base / jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) ~ [na: na] account_app_1 |в java.base / java.lang.reflect.Constructor.newInstance (Constructor.java:490) ~ [na: na] account_app_1 |в com.mysql.cj.exceptions.ExceptionFactory.createException (ExceptionFactory.java:61) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.exceptions.ExceptionFactory.createException (ExceptionFactory.java:105) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.exceptions.ExceptionFactory.createException (ExceptionFactory.java:151) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException (ExceptionFactory.java:167) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.protocol.a.NativeSocketConnection.connect (NativeSocketConnection.java:91) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |at com.mysql.cj.NativeSession.connect (NativeSession.java:152) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:955) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:825) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |
... 214 общих кадровопущено account_app_1 |Вызвано: java.net.ConnectException: соединение отклонено (соединение отклонено) account_app_1 |в java.base / java.net.PlainSocketImpl.socketConnect (собственный метод) ~ [na: na] account_app_1 |в java.base / java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:399) ~ [na: na] account_app_1 |в java.base / java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java:242) ~ [na: na] account_app_1 |в java.base / java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java:224) ~ [na: na] account_app_1 |в java.base / java.net.SocksSocketImpl.connect (SocksSocketImpl.java:403) ~ [na: na] account_app_1 |в java.base / java.net.Socket.connect (Socket.java:591) ~ [na: na] account_app_1 |в com.mysql.cj.protocol.StandardSocketFactory.connect (StandardSocketFactory.java:155) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |в com.mysql.cj.protocol.a.NativeSocketConnection.connect (NativeSocketConnection.java:65) ~ [mysql-connector-java-8.0.15.jar! /: 8.0.15] account_app_1 |
... 217общие рамки пропущены account_app_1 |

Есть предложения?

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

При запуске составного «стека» docker использует собственный механизм DNS.

Это означает, что если вы выполняете запрос DNS внутри контейнера account_app для имени хоста mysql, запрос будетвернуть IP-адрес контейнера с именем mysql (возможно, с префиксом имени стека)

Короче говоря : настроить приложение Spring для подключения к базе данных mysql не на localhost, а на mysql и все готово.

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

0 голосов
/ 23 сентября 2019

Я думаю, что вы используете "localhost" в качестве имени хоста сервера mysql,

jdbc:mysql://localhost:3306

попробуйте изменить его на

jdbc:mysql://host.docker.internal:3306

Вы не можете localhost внутри контейнера Docker.Лучший способ сделать это - передать URL-адрес jdbc в качестве переменной среды.

SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/code_master

Пожалуйста, проверьте последние 5 строк этого файла sh, https://github.com/keaz/code_master/blob/develop/build_docker.sh

0 голосов
/ 23 сентября 2019

Существует неправильное представление о сопоставлении портов: вы передаете весь свой трафик с хост-порта 3306 на контейнерный порт 3306, но это не двунаправлено.он не работает в Windows и Mac) вы можете добавить в свой docker-compose.yml эту конфигурацию, позволяя контейнеру использовать службы хоста.

network_mode: "host"

В противном случае вы можете настроитьлокальный MySql, чтобы принять соединение от внешних IP-адресов и указать базу данных контейнера на ваш IP-адрес.

Обратите внимание, что это решение будет работать нормально только на локальной машине разработки, я настоятельно рекомендую избегать этого в любой производственной среде.

...