【问题标题】:Cannot connect MySQL with Spring Boot in docker-compose无法在 docker-compose 中将 MySQL 与 Spring Boot 连接起来
【发布时间】:2020-08-05 06:17:16
【问题描述】:

我在使用 Docker 使用 mysql 运行 spring boot 时遇到问题。它在没有 Docker 的情况下在本地运行良好。 我的码头文件

FROM maven:3.3-jdk-8-alpine

ENV MAVEN_HOME /usr/lib/mvn
ENV PATH $MAVEN_HOME/bin:$PATH
ENV SPRING_DATASOURCE_URL jdbc:mysql://my-db:3306/registration_springboot?createDatabaseIfNotExist=true

ENV SPRING_DATASOURCE_USERNAME vnphu
ENV SPRING_DATASOURCE_PASSWORD password

docker-compose.yml 文件

version: '3'
services:
  my-db:
     image: mysql/mysql-server:5.7
     container_name: my-db
     environment:
         MYSQL_USER: vnphu
         MYSQL_DATABASE: registration_springboot
         MYSQL_PASSWORD: password
         MYSQL_ROOT_PASSWORD: password
     ports:
          - '3306-3306'

  web:
    build: .
    working_dir: /app
    volumes:
        - .:/app
        - ~/.m2:/root/.m2
    ports:
        - "8080:8080"
    command: mvn clean spring-boot:run
    depends_on:
        - my-db

运行时报错:docker-compose up --build

Caused by: java.net.ConnectException: Connection refused (Connection refused)
web_1    |      at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_121]
web_1    |      at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_121]
web_1    |      at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_121]
web_1    |      at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_121]
web_1    |      at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_121]
web_1    |      at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_121]
web_1    |      at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.19.jar:8.0.19]
web_1    |      at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~[mysql-connector-java-8.0.19.jar:8.0.19]
web_1    |      ... 115 common frames omitted

【问题讨论】:

标签: mysql spring-boot docker docker-compose


【解决方案1】:

web 应用程序正在尝试连接到尚不可用的my-db(数据库仍在加载中)您可以根据自己的喜好使用以下任何解决方案。

  1. 重启失败

    修改 docker-compose 文件为

    web:
     ports: 
       "8080:8080"
     restart:on-failure
    
  2. 睡觉

    修改环境下的docker-compose文件

    web:
     ports:
       "8080:8080"
     environment:
       -SLEEP_LENGTH=5
    
  3. wait-for-it.sh 文件

    wait-for-it file

    这种方法需要你修改你的 Dockerfile 以及 docker-compose 文件

【讨论】:

    【解决方案2】:

    问题在于我在 Dockerfile 中的 ENV,因为我在 Shell 中也有一个同名的环境变量,它将优先。

    ENV SPRING_DATASOURCE_URL jdbc:mysql://my-db:3306/registration_springboot?createDatabaseIfNotExist=true
    

    在 docker-compose.yml 中将变量添加到环境后,它起作用了

    web:
       environment:
            SPRING_DATASOURCE_URL: jdbc:mysql://my-db:3306/registration_springboot?createDatabaseIfNotExist=true
    

    docker-compose.yml 将按以下顺序查找:

    1. 编写文件
    2. Shell 环境变量
    3. 环境文件
    4. Dockerfile
    5. 变量未定义

    更多详情可以参考这篇文章:https://vsupalov.com/override-docker-compose-dot-env/

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2016-02-19
      • 2019-11-25
      • 2020-06-06
      • 2019-07-07
      • 2023-02-23
      • 2018-01-25
      • 2021-10-23
      相关资源
      最近更新 更多