繁体   English   中英

无法在 docker-compose 中将 MySQL 与 Spring 连接

[英]Cannot connect MySQL with Spring Boot in docker-compose

我在使用 Docker 和 mysql 运行 spring 引导时遇到问题。 在没有 Docker 的情况下,它在本地运行良好。 我的 dockerfile

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

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. 等待它.sh 文件

    等待它的文件

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

问题在于我在 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/

您的服务和数据库不在同一个网络上。 考虑定义一个网络并添加到每个服务和数据库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM