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

docker-compose环境下Golang应用连接MySQL报connection refused问题求助

问题产生原因
  1. 服务启动顺序错位
    docker-compose默认仅保证服务的启动先后顺序,不会等待下游服务完全就绪。MySQL首次启动时需要执行初始化、创建默认库/用户、加载配置等操作,耗时通常在5~30秒不等,此时提前启动的Golang应用发起连接请求就会被拒绝。
  2. 数据库连接配置缺失端口
    你当前Golang代码中的Addr字段仅填写了MySQL服务的主机名mysqldb,未指定3306端口,部分版本的MySQL驱动不会默认补全端口,导致连接请求目标异常。
  3. MySQL 8.0认证插件兼容性问题
    mysql:8镜像默认使用caching_sha2_password作为用户认证插件,旧版本的Golang MySQL驱动不支持该认证方式,也会触发连接拒绝报错。
  4. MySQL配置挂载路径错误
    你当前配置中MySQL配置目录挂载路径为/etc/mysql/conf/conf.d,而官方MySQL镜像默认加载的配置目录为/etc/mysql/conf.d,自定义的MySQL配置无法生效,可能导致MySQL仅监听本地地址,拒绝容器网络的访问请求。
解决方案

针对上述原因,可依次执行以下修复操作:

  • 调整服务依赖规则,增加健康检查
    修改docker-compose.yml配置,为MySQL服务增加健康检测,确保Golang应用在MySQL完全就绪后再启动:
version: '3.8'
services:
  app:
    build: ./
    volumes:
      - ./internal/app:/app
      - ./logs:/var/log/parser
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mysql:8
    container_name: mysqldb
    ports:
      - "3306:3306"
    volumes:
      # 修正配置挂载路径
      - ./docker/mysql/conf:/etc/mysql/conf.d
      - ./docker/mysql/logs/:/var/log/mysql
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
      - ./docker/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: data
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      # 可选:强制使用兼容旧驱动的认证插件
      MYSQL_DEFAULT_AUTH: mysql_native_password
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uuser", "-ppass"]
      interval: 5s
      timeout: 10s
      retries: 3
  • 补全Golang数据库连接配置
    修改main.go中的连接地址,明确指定端口,同时增加Ping调用主动校验连接有效性:
dbConfig := mysql.NewConfig()
dbConfig.User = "user"
dbConfig.Passwd = "pass"
// 补全3306端口
dbConfig.Addr = "mysqldb:3306"
dbConfig.DBName = "data"
dbConfig.Net = "tcp"
db, err := sql.Open("mysql", dbConfig.FormatDSN())
if err != nil {
    panic(err.Error())
}
// 增加Ping调用,主动触发连接校验
if err = db.Ping(); err != nil {
    panic(err.Error())
}
defer db.Close()
  • 升级Golang MySQL驱动
    执行命令升级驱动到最新版本,兼容MySQL 8.0的默认认证方式:
    go get -u github.com/go-sql-driver/mysql

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:48:02