为什么后端构建镜像时无法连接mysql

问题描述 投票:0回答:1

当我使用 docker compose up 来构建所有服务并在构建阶段后端(spring-boot)无法连接 MySQL 数据库时运行时,它无法为后端构建和运行映像。

我尝试将所有服务设置在同一网络中,但它不起作用

version: '3'
services:
  database:
    build:
      context: ./database
      dockerfile: database.Dockerfile
    environment:
      - MYSQL_ROOT_PASSWORD=mysql@sit
    volumes:
      - ./database/mysql-lib:/var/lib/mysql
      # - ./database/my.cnf:/etc/my.cnf
      # - ./database/setup/:/docker-entrypoint-initdb.d/
    restart: on-failure
    networks:
    - test-networks
  backend:
    depends_on:
      - database
      
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=mysql@sit
      - MYSQL_URL=jdbc:mysql://database:3306/task_base?serverTimezone=UTC
    networks:
      - test-networks

networks:
  test-networks:
    driver: bridge

这是我的

Dockerfile
(后端)

FROM maven:3.8.3-openjdk-17
COPY . /backendAPI
WORKDIR /backendAPI
RUN mvn clean package
ENTRYPOINT ["java","-jar","/backendAPI/target/*.jar"]

数据库的dockerfile

FROM mysql/mysql-server:latest
COPY ./my.cnf /etc/
VOLUME ./mysql-lib /var/lib/mysql
COPY ./setup/db-script-v2.sql /docker-entrypoint-initdb.d/
ENV  MYSQL_ROOT_PASSWORD=mysql@sit

我的项目结构

ITB-KK-Backend
├─ .mvn
│  └─ wrapper
│     ├─ maven-wrapper.jar
│     └─ maven-wrapper.properties
├─ database
│  ├─ database.Dockerfile
│  ├─ my.cnf
│  └─ setup
│     └─ db-script-v2.sql
├─ docker-compose.yaml
├─ Dockerfile
├─ mvnw
├─ mvnw.cmd
├─ pom.xml
└─ src
   ├─ main

我的

application.properties
(spring-boot配置文件)

spring.application.name=ITB-KK
spring.datasource.username={MYSQL_USER:root}
spring.datasource.password={MYSQL_PASSWORD:123456}
spring.datasource.url=jdbc:mysql://${MYSQL_URL:localhost}:3306/task_base?serverTimezone=UTC
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.main.banner-mode=off
server.servlet.context-path=/itb-kk
#spring.jackson.time-zone=UTC
#spring.jpa.properties.hibernate.jdbc.time_zone=UTC
server.error.include-stacktrace=never

但是当我运行 compose up 时出现错误

309.6 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
309.6
309.6 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
309.6   at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189) ~[mysql-connector-j-8.3.0.jar:8.3.0]
309.6   at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) ~[HikariCP-5.0.1.jar:na]
309.6   at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-5.0.1.jar:na]
309.6   at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]  
309.6   at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:428) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
309.6   at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) ~[hibernate-core-6.4.4.Final.jar:6

我希望能够成功为后端构建 docker 镜像,但我不知道为什么不能

mysql spring-boot docker docker-compose dockerfile
1个回答
0
投票

将您的

docker-compose.yml
更新为如下所示:

version: '3'
services:
  database:
    build:
      context: ./database
      dockerfile: database.Dockerfile
    environment:
      - MYSQL_ROOT_PASSWORD=mysql@sit
    volumes:
      - ./database/mysql-lib:/var/lib/mysql
    restart: on-failure
    networks:
    - test-networks
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]
      interval: 5s
      timeout: 5s
      retries: 5

  backend:
    depends_on:
      database:
        condition: service_healthy
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - MYSQL_USER=root
      - MYSQL_PASSWORD=mysql@sit
      - MYSQL_URL=jdbc:mysql://database:3306/task_base?serverTimezone=UTC
    networks:
      - test-networks

networks:
  test-networks:
    driver: bridge

重要变化:

  • healthcheck
    添加到
    database
    服务。只有当
    mysqladmin
    能够获得成功的 ping 时,该服务才会被标记为“健康”,这表明数据库已准备就绪。
  • 更新
    depends_on
    服务的
    backend
    ,以取决于
    database
    服务已标记为“健康”的条件。
© www.soinside.com 2019 - 2024. All rights reserved.