Docker Compose: Spring Boot 连接 MySQL 数据库被拒绝

5
我对Docker还不是很熟悉,我需要使用docker-compose在docker工具箱中启动我的Angular/SpringBoot/MySQL项目。我将一个使用相同技术的Docker yml文件复制到我的项目中,并更改其中的路径以匹配我的项目。但是当我尝试运行docker-compose时,它会抛出以下错误:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
[...] 84 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)

docker-compose.yml 如下:
version: '3'

services:
  database:
    image: mysql
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: ****
      MYSQL_DATABASE: db_example
      MYSQL_USER: springuser
      MYSQL_PASSWORD: ****
    ports:
      - 3306:3306
    volumes:
      - db_exampleData:/var/lib/mysql

  springapi:
    image: openjdk:10-jre-slim
    container_name: springapi
    ports:
      - 8443:8443
    depends_on:
      - database
    volumes:
      - ./backend/target/backend-0.1.0.jar:/application.jar
    command: ["java", "-jar", "application.jar"]

  angular:
    image: nginx:alpine
    container_name: angular
    ports:
      - 4200:80
    depends_on:
      - springapi
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./frontend/my-app/dist/my-app:/usr/share/nginx/html

volumes:
  db_exampleData:

应用程序属性文件:

spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:mysql://localhost:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=****

server.port=8443

任何建议都将有所帮助!


你的应用程序是如何引用MySQL容器的?URL看起来是什么样子的? - jordiburgos
将上面的问题添加属性。 - Japhet
1个回答

3

您需要像这样更改您的连接:

jdbc:mysql://database:3306/db_example

并将以下内容添加到您的springapi服务的docker-compose文件中:

links:
   - database

另一方面,您可以使用wait-for-it.sh来检查DB是否已启动,只需在springapi服务下添加一个命令部分即可。
command: ["path/to/wait-for-it.sh", "database:3306", "-t", "6000", "--", "YOUR ACTUAL COMMAND"]

等待(wait-for-it.sh)脚本应该放在哪里?我把它放在和yml文件相同的位置,但是它给了我一个错误(没有这样的文件或目录)。 - Japhet
那是一个可选项,如果你需要等待数据库。 - LinPy
是的,我在其他几个帖子中也看到了这个,所以我认为最好实施它。我更新了最后一条评论,不小心在写作时点击了发送。 - Japhet
是的,当然。在使用之前,您需要获取脚本并安装它 - 为此,您需要使用 Dockerfile。但正如我所说,这不是必须的。 - LinPy
好的,我稍后会查看。现在Docker在2019-06-25 13:26:39.553停止工作,日志显示:INFO 1 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat已启动,端口为8443(http),上下文路径为空,它应该打印出更多命令和Angular启动信息。 - Japhet
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接