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

Docker环境下使用Goose执行PostgreSQL数据库迁移失败求助

Docker环境下使用Goose执行PostgreSQL数据库迁移失败求助

看起来你在Docker环境里用Goose做PostgreSQL迁移的时候踩坑了,我帮你梳理下几个大概率的问题和解决办法:

首先,你的Goose命令格式有明显错误

你当前的命令把数据库连接串放到了--hostname参数后面,而且镜像名还打错了(是gomicro/goose不是gomicro/goosep),这肯定跑不起来。另外还有两个关键问题:一是Docker容器里没法直接用localhost访问宿主机的Postgres,二是你没把本地的迁移文件目录挂载到Goose容器里,容器根本找不到你的SQL迁移文件。

给你一个修正后的命令(假设你当前就在sql/schema目录的上级目录下):

# macOS/Windows 用这个
docker run -v $(pwd)/sql/schema:/sql gomicro/goose postgres "postgresql://postgres:postgres@host.docker.internal:5432/blogator?sslmode=disable" up

# Linux 需要额外加--add-host参数
docker run --add-host host.docker.internal:host-gateway -v $(pwd)/sql/schema:/sql gomicro/goose postgres "postgresql://postgres:postgres@host.docker.internal:5432/blogator?sslmode=disable" up

这里解释下几个关键点:

  • -v $(pwd)/sql/schema:/sql:把本地的sql/schema目录挂载到Goose容器的/sql目录,这样Goose才能读取到你的迁移SQL文件
  • host.docker.internal:Docker容器里的localhost是它自己的网络,要用这个特殊别名访问宿主机上的Postgres服务
  • ?sslmode=disable:本地测试时先禁用SSL连接,避免因为SSL配置导致连接失败
  • 镜像名修正为gomicro/goose,你之前多打了个p

其次,确认目标数据库是否存在

Goose是在已存在的数据库上执行表迁移的,如果你还没创建blogator这个数据库,得先手动创建:

  1. 进入Postgres容器:
docker exec -it postgres-0 psql -U postgres
  1. 在PostgreSQL命令行里创建数据库:
CREATE DATABASE blogator;
  1. 输入\q退出,再跑上面的Goose迁移命令

最后,检查迁移文件的命名格式

Goose对迁移文件的命名有严格要求,必须是数字_描述性名称.sql的格式,比如001_create_posts_table.sql。如果你的文件名不符合这个规则,Goose会直接忽略这些文件,导致看起来好像没执行迁移。

你可以按照上面的步骤逐一排查,应该就能解决问题啦!

备注:内容来源于stack exchange,提问作者Marvin Brafman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:28:02