Spring boot JDBC не может подключиться к mysql в контейнере Docker - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь запустить приложение весенней загрузки (в виде простого REST API) и сервер MySQL в двух отдельных контейнерах Docker. Но я не могу получить соединение JDBC в приложении Spring для подключения к MySQL. Они оба работают независимо, и реализация работает, когда я запускаю весеннюю загрузку и mysql локально.

docker-compose.yml

version: '3'
services:
  database:
    image: mysql:latest
    container_name: mysqldb
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
    expose:
      - 3306
    ports:
      - 3306:3306
    networks:
      - backend
    volumes:
      - "dbdata:/var/lib/mysql"

  web:
    container_name: springboot
    build: .
    depends_on:
      - database
    expose:
      - 8080
    ports:
      - 8080:8080
    networks:
      - backend

networks:
  backend:

volumes:
  dbdata:

В приложении весенней загрузки:

val dataSource = DriverManagerDataSource()
dataSource.setDriverClassName("com.mysql.jdbc.Driver")
dataSource.setUrl("jdbc:mysql://mysqldb:3306/$dbName?characterEncoding=latin1")
dataSource.username = "dev"
dataSource.password = "password"

val jdbcTemplate = JdbcTemplate(dataSource)

Ошибка возврата из пружинной загрузки:

{
    "status": 500,
    "error": "Internal Server Error",
    "message": "Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure\n\nThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server."
}

Я МОГУ подключиться к контейнеру mysql из загрузочного контейнера пружины через mysql cli. Итак, похоже, что контейнер Springboot может разрешить «mysqldb».

Кажется, все должно быть довольно просто. Я не уверен, в чем заключается ошибка, но я предполагаю, что это как-то связано с внутренней работой пружинных сапог, с которой я не знаком.

1 Ответ

2 голосов
/ 30 сентября 2019

измените dataSource.setUrl("jdbc:mysql://mysqldb:3306/$dbName") на:

dataSource.setUrl("jdbc:mysql://database:3306/$dbName")

имя вашей услуги в compose равно database, поэтому вам необходимо использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...