首页 > 解决方案 > Docker-compose MySQL 链接失败

问题描述

编辑:我设法让它工作

我目前正在将 docker 与 Dockerfile 和 docker-compose.yml 结合使用,我正在尝试运行我的后端,以便可以使用 Postman 从数据库中获取数据。但是我不断收到通信链接故障 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"] 

码头工人-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

应用程序属性

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 是使用 Kotlin 使用 SpringBoot 制作的。有人可以帮我弄清楚如何解决这个问题吗?

标签: mysqlspring-bootdockerdocker-composedockerfile

解决方案


要实现正确的服务启动顺序,您需要添加 2 件事:

  1. 设置容器的名称,让它们通过这些名称相互 ping 通(通过 docker 桥)
  2. 强制您的应用程序在连接之前等待 DB 完全启动。

从这一点来看,您的 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-mysqldocker-mysql-container


推荐阅读