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

Docker Compose部署Go REST API连MySQL提示Unknown database 'puapp'错误

问题原因

Error 1049: Unknown database 'puapp' 错误的核心是Go服务连接MySQL时,puapp库还未创建,具体触发原因通常为以下几种:

  1. 服务启动顺序问题:depends_on仅保证MySQL容器先启动,不会等待MySQL内部初始化(执行/docker-entrypoint-initdb.d下的SQL、完成库表创建)完成,Go服务启动速度远快于MySQL初始化速度,导致连接时库还没建。
  2. 历史卷数据残留:如果你之前运行过该Docker Compose配置,关联的db_volume持久化卷已经存储了未创建puapp库的MySQL数据,后续即使修改了初始化SQL,MySQL检测到已有数据目录就不会再执行/docker-entrypoint-initdb.d下的脚本。
  3. 初始化SQL逻辑缺失:你的dump.sql中没有添加CREATE DATABASE语句创建puapp库。

修复步骤

  1. 补全MySQL初始化逻辑
    两种方案二选一即可,推荐同时配置更稳妥:
  • 在docker-compose.yml的db服务environment中添加自动建库配置:
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=puapp
    
  • 检查dump.sql开头是否包含建库语句,没有就添加:
    CREATE DATABASE IF NOT EXISTS puapp DEFAULT CHARSET utf8mb4;
    USE puapp;
    -- 后续为你的建表语句
    
  1. 清理历史残留数据
    执行以下命令停止服务并删除关联的持久化卷,确保下次启动MySQL会重新执行初始化脚本:
docker compose down -v
  1. 解决启动顺序差问题
    二选一即可:
  • 方案1:修改Go代码添加重试逻辑:在数据库连接逻辑外层加重试机制,连接失败时间隔2-3秒重试,最多重试5-10次,等待MySQL初始化完成。
  • 方案2:在容器启动时检测端口可用性:
    首先修改Go服务的Dockerfile,安装网络检测工具:
    # 在Run stage中添加以下行
    RUN apk add --no-cache netcat-openbsd
    
    然后在docker-compose.yml的api-service中添加启动命令,等待MySQL端口通了再启动服务:
    command: sh -c 'while ! nc -z db 3306; do sleep 1; done; ./restserv'
    

其他注意事项

你当前配置中Go服务的Dockerfile暴露端口是8080,但Docker Compose的端口映射为8080:80,需要确认Go服务实际监听的端口是否匹配,避免后续访问不通的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:06:04