Liquibase连接MySQL失败:通信链路故障求助
问题描述
执行docker-compose up启动服务时,Liquibase无法连接MySQL数据库,报错如下:
Unexpected error running Liquibase: Connection could not be created to jdbc:mysql://mysql:3306/patshala?useSSL=false&allowPublicKeyRetrieval=true with driver com.mysql.cj.jdbc.Driver. Communications link failure backend-liquibase-1 | backend-liquibase-1 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. backend-liquibase-1 | - Caused by: Connection refused
使用的Docker Compose配置文件如下:
version: '3.8' services: mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: patshala ports: - "3306:3306" liquibase: image: liquibase/liquibase:latest command: [ "--url=jdbc:mysql://mysql:3306/patshala?useSSL=false&allowPublicKeyRetrieval=true", "--username=root", "--password=root", "--changeLogFile=/changelog/db.changelog.xml", "update" ] volumes: - ./db:/liquibase/changelog - ./mysql-connector-j-8.1.0.jar:/liquibase/lib/mysql-connector-j-8.1.0.jar depends_on: - mysql networks: app-network: driver: bridge
Docker Compose文件位于./backend目录,驱动jar包路径无误。
排查与解决方法
核心原因:
depends_on仅保证容器启动顺序,不代表MySQL服务已完成初始化并可接受连接。Liquibase启动时,MySQL可能还在加载数据、初始化权限,导致连接被拒绝。方案1:使用Docker健康检查(最可靠)
给MySQL服务添加健康检查规则,让Liquibase仅在MySQL健康状态达标后启动:services: mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: patshala ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 5s retries: 5 liquibase: image: liquibase/liquibase:latest command: [ "--url=jdbc:mysql://mysql:3306/patshala?useSSL=false&allowPublicKeyRetrieval=true", "--username=root", "--password=root", "--changeLogFile=/changelog/db.changelog.xml", "update" ] volumes: - ./db:/liquibase/changelog - ./mysql-connector-j-8.1.0.jar:/liquibase/lib/mysql-connector-j-8.1.0.jar depends_on: mysql: condition: service_healthy方案2:添加启动等待脚本
修改Liquibase的启动命令,先循环检测MySQL端口是否可用,再执行更新操作:liquibase: image: liquibase/liquibase:latest command: sh -c "until nc -z mysql 3306; do sleep 1; echo 'Waiting for MySQL...'; done && liquibase --url=jdbc:mysql://mysql:3306/patshala?useSSL=false&allowPublicKeyRetrieval=true --username=root --password=root --changeLogFile=/changelog/db.changelog.xml update" volumes: - ./db:/liquibase/changelog - ./mysql-connector-j-8.1.0.jar:/liquibase/lib/mysql-connector-j-8.1.0.jar depends_on: - mysql注:如果Liquibase镜像未安装
nc,可在命令开头添加apt-get update && apt-get install -y netcat &&来安装工具。额外检查点
- 查看MySQL容器日志:执行
docker-compose logs mysql,确认是否出现ready for connections的初始化完成提示 - 验证JDBC URL:YAML数组形式的command中,
&可直接替换为&,避免转义问题 - 检查驱动jar包:执行
docker exec -it <liquibase容器ID> ls /liquibase/lib/,确认mysql驱动jar存在
- 查看MySQL容器日志:执行
内容的提问来源于stack exchange,提问作者Mabel Oza
相关产品推荐
相关产品推荐

