Docker-Compose首次启动时Liquibase无法连接MySQL数据库
解决Docker-Compose中Liquibase首次启动无法连接MySQL的问题
问题背景
通过Docker-Compose搭建开发环境,包含MySQL容器(database)和Liquibase容器,数据通过my-db卷实现持久化。但首次执行docker-compose up或删除卷后启动时,Liquibase容器无法连接MySQL。原healthcheck仅检测MySQL服务是否可ping通,未验证目标数据库及用户权限是否完全就绪。
优化方案
1. 强化MySQL的healthcheck配置
将原healthcheck的测试命令替换为直接连接目标数据库并执行查询,确保数据库初始化完成、用户权限配置正确。同时调整启动等待时长,适配首次启动的初始化耗时。
2. 配置Liquibase依赖MySQL的健康状态
在Liquibase的depends_on中添加健康检查条件,确保仅当MySQL完全就绪后才启动Liquibase。
修改后的完整配置
liquibase: image: liquibase/liquibase:latest volumes: - ./CBCDevDB/:/liquibase/changelog/ environment: - INSTALL_MYSQL=true command: --defaultsFile=/liquibase/changelog/liquibase.dev.properties update networks: - lbdb depends_on: database: condition: service_healthy # 等待MySQL健康检查通过后启动 database: image: mysql:latest environment: - MYSQL_DATABASE=db - MYSQL_USER=liquibase - MYSQL_PASSWORD=liquibase - MYSQL_ROOT_PASSWORD=example restart: always ports: - "3307:3306" command: --default-authentication-plugin=mysql_native_password volumes: - my-db:/var/lib/mysql networks: - lbdb - backend healthcheck: test: [ "CMD", "mysql", "-u${MYSQL_USER}", "-p${MYSQL_PASSWORD}", "-hlocalhost", "-D${MYSQL_DATABASE}", "-e", "SELECT 1;" ] start_period: 10s # 延长首次启动等待时长,适配数据库初始化 interval: 5s timeout: 5s retries: 15 # 增加重试次数,避免初始化超时 volumes: my-db: networks: lbdb: {} backend: {}
配置说明
- healthcheck测试命令:
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -hlocalhost -D${MYSQL_DATABASE} -e "SELECT 1;"会直接连接到指定的db数据库,执行简单查询。只有当数据库存在、用户拥有访问权限、MySQL服务完全就绪时,命令才会返回成功。 - start_period:设置为10秒,给MySQL足够的时间完成首次启动时的数据库创建、用户权限配置等初始化操作。
- depends_on condition:
service_healthy确保Liquibase不会在MySQL未就绪时提前启动,彻底解决连接失败问题。
内容的提问来源于stack exchange,提问作者HSE
相关产品推荐
相关产品推荐

