Docker Compose部署Go REST API连MySQL提示Unknown database 'puapp'错误
问题原因
Error 1049: Unknown database 'puapp' 错误的核心是Go服务连接MySQL时,puapp库还未创建,具体触发原因通常为以下几种:
- 服务启动顺序问题:
depends_on仅保证MySQL容器先启动,不会等待MySQL内部初始化(执行/docker-entrypoint-initdb.d下的SQL、完成库表创建)完成,Go服务启动速度远快于MySQL初始化速度,导致连接时库还没建。 - 历史卷数据残留:如果你之前运行过该Docker Compose配置,关联的
db_volume持久化卷已经存储了未创建puapp库的MySQL数据,后续即使修改了初始化SQL,MySQL检测到已有数据目录就不会再执行/docker-entrypoint-initdb.d下的脚本。 - 初始化SQL逻辑缺失:你的
dump.sql中没有添加CREATE DATABASE语句创建puapp库。
修复步骤
- 补全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; -- 后续为你的建表语句
- 清理历史残留数据
执行以下命令停止服务并删除关联的持久化卷,确保下次启动MySQL会重新执行初始化脚本:
docker compose down -v
- 解决启动顺序差问题
二选一即可:
- 方案1:修改Go代码添加重试逻辑:在数据库连接逻辑外层加重试机制,连接失败时间隔2-3秒重试,最多重试5-10次,等待MySQL初始化完成。
- 方案2:在容器启动时检测端口可用性:
首先修改Go服务的Dockerfile,安装网络检测工具:
然后在# 在Run stage中添加以下行 RUN apk add --no-cache netcat-openbsddocker-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
相关产品推荐
相关产品推荐

