You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存在

内容的提问来源于stack exchange,提问作者Mabel Oza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:12:03