当我使用 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 镜像,但我不知道为什么不能
将您的
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
服务已标记为“健康”的条件。