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这个数据库,得先手动创建:
- 进入Postgres容器:
docker exec -it postgres-0 psql -U postgres
- 在PostgreSQL命令行里创建数据库:
CREATE DATABASE blogator;
- 输入
\q退出,再跑上面的Goose迁移命令
最后,检查迁移文件的命名格式
Goose对迁移文件的命名有严格要求,必须是数字_描述性名称.sql的格式,比如001_create_posts_table.sql。如果你的文件名不符合这个规则,Goose会直接忽略这些文件,导致看起来好像没执行迁移。
你可以按照上面的步骤逐一排查,应该就能解决问题啦!
备注:内容来源于stack exchange,提问作者Marvin Brafman
相关产品推荐
相关产品推荐

