springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)
以下讨论基于Docker Compose的V2版本:
现在容器编排使用广泛,大家都在用docker-compose进行网站部署,在部署的过程中,会使用到Mysql,Redis,JAVA后端程序,PHP后端程序之类的,会涉及到一个程序的启动先后问题,一般的解决方案都是在Compose文件中,添加depends_on参数,例如:
version: "2.4"
services:
xxl-job-mysql:
container_name: xxl-job-mysql
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
image: mysql:5.7
networks:
xxl-job-network:
ipv4_address: 192.168.189.2
ports:
- 3306:3306
restart: always
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/initdb:/docker-entrypoint-initdb.d
xxl-job-admin:
container_name: xxl-job-admin
environment:
- PARAMS=--spring.datasource.url=jdbc:mysql://xxl-job-mysql:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 \
--spring.datasource.username=root \
--spring.datasource.password=123456 \
--xxl.job.accessToken=
image: xuxueli/xxl-job-admin:2.3.0
networks:
xxl-job-network:
ipv4_address: 192.168.189.3
ports:
- 8080:8080
restart: always
# 依赖于数据库,先启动数据库再启动JAVA程序
depends_on:
- xxl-job-mysql
networks:
xxl-job-network:
driver: bridge
ipam:
config:
- subnet: 192.168.189.0/24
name: xxl-job-network
以上编排文件好像看起来没什么问题,但实际执行的时候,在数据库启动后,因为depends_on参数,会在启动数据库后马上启动JAVA程序。不管Mysql是否已经启动完成。这时候就可能出现数据库还没启动好,JAVA程序就已经启动完成,并尝试去连接数据库,造成连接失败,JAVA程序报错。所以说,depends_on并没有真正的等待上一个程序启动完成。这个在docker官方文档也有说明:https://docs.docker.com/compose/startup-order/
里面有一句"