【问题标题】:Docker-compose MySQL link failureDocker-compose MySQL 链接失败
【发布时间】:2020-05-11 11:42:20
【问题描述】:

编辑:我已经设法让它工作了

我目前正在将 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"] 

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

【问题讨论】:

  • 这是由于mysql服务还没有准备好,你的java服务需要等到mysql服务准备好接受连接,检查这个docs.docker.com/compose/startup-ordergithub.com/vishnubob/wait-for-it你可以通过重启你的测试应用服务容器。
  • 我已添加command: ["./wait-for-it.sh", "docker-mysql:3306"] 行,但问题仍然存在。我之前尝试过重新启动应用程序服务容器,但当时没有用,现在也没有。还有其他想法吗?
  • 你在wait-for-it.sh文件中放了什么?您能否更新您的问题以将其也包含在内。
  • 我刚刚将它添加到我的 docker-compose 文件中。我自己没有创建 wait-for-it.sh 文件,因为在此处的文档中:docs.docker.com/compose/startup-order 似乎已经有一个预定义的文件
  • 只需下载raw.githubusercontent.com/vishnubob/wait-for-it/master/…,并将文件放在与docker-compose.yml相同的目录下即可。

标签: mysql spring-boot docker docker-compose dockerfile


【解决方案1】:

要实现正确的服务启动顺序,您需要添加 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-mysql 替换为容器名称 docker-mysql-container

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2019-12-07
    • 2022-01-16
    • 2018-07-21
    • 2018-03-27
    相关资源
    最近更新 更多