Docker -составить MySQL сбой соединения - PullRequest
0 голосов
/ 25 января 2020

РЕДАКТИРОВАТЬ: мне удалось заставить его работать

В настоящее время я использую docker в сочетании с Dockerfile и docker -compose.yml i ' Я пытаюсь запустить свой бэкэнд, чтобы я мог использовать Почтальон для получения данных из базы данных. Однако я продолжаю получать сообщение о сбое линии связи com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

Dockerfile

FROM openjdk:8-jdk-alpine
EXPOSE 8080
ADD /build/libs/assignment_4-0.0.1-SNAPSHOT.jar spring-docker.jar
ENTRYPOINT ["java", "-jar", "spring-docker.jar"] 

docker -compose.yml

version: '3'

services:
  docker-mysql:
    restart: always
    container_name: docker-mysql
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: database
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: '%'
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"

  app:
    image: springio/docker
    expose:
      - "8080"
    ports:
      - 8080:8080
    environment:
      WAIT_HOSTS: mysql:3306
    depends_on:
      - docker-mysql

application.properties

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://docker-mysql:3306/database
spring.datasource.username=root
spring.datasource.password=root

# To keep the database connection alive while idle for a long time 
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

API сделан с SpringBoot с использованием Kotlin. Может кто-нибудь помочь мне разобраться, как решить эту проблему?

1 Ответ

0 голосов
/ 02 марта 2020

Чтобы добиться правильного порядка запуска служб, вам нужно добавить 2 вещи:

  1. Установить имена контейнеров, чтобы они могли пинговать друг друга по этим именам (с помощью docker bridge)
  2. Заставьте ваше приложение дождаться полной загрузки БД перед подключением.

С этого момента ваш Dockerfile может выглядеть следующим образом (пусть мы выберем wait-for-it)

FROM openjdk:8-jdk-alpine
EXPOSE 8080
RUN apk add --no-cache bash
RUN wget -q https://github.com/vishnubob/wait-for-it/raw/master/wait-for-it.sh -O /usr/bin/wait-for-it && \
    chmod +x /usr/bin/wait-for-it
ADD /build/libs/assignment_4-0.0.1-SNAPSHOT.jar spring-docker.jar
ENTRYPOINT /usr/bin/wait-for-it docker-mysql-container:3306 -t 120 ; java -jar spring-docker.jar

В то время как docker-compose.yml должен включать

version: '3'

networks:
  database:

services:
  docker-mysql:
    networks:
      - database
    container_name: docker-mysql-container
    ...

  app:
    networks:
      - database
    container_name: app-container
    ...

и заменить в application.properties имя службы docker-mysql именем контейнера docker-mysql-container

...