Docker 中使用 pg_restore 遇到的问题

结论:提前创建数据库再执行docker exec -u postgres -i [postgres_container] pg_restore -d postgres < ~/db.backup


起因是想把使用pg_dump导出的本地数据导入到云端,就用了下面这个命令

docker exec -u postgres [postgres_container] pg_restore -C -d postgres < ~/db.backup

命令敲进去之后发现终端就没声了,Ctrl + C 可以正常 kill 掉,但是不 kill 它就不会有任何输出,开一晚上也不会有任何反应。

经过研究,发现应该加个 -i

docker exec -u postgres -i [postgres_container] pg_restore -C -d postgres < ~/db.backup

-h文档里是这样写的:

-i, --interactive Keep STDIN open even if not attached

所以我命令中加上-i才能够让在我没有 attach 到容器的情况下正常导入文件。(我的理解)


加上这个-i之后可算有反应了,虽然是报错

pg_restore: [archiver (db)] connection to database "postgres" failed: FATAL: database "postgres" does not exist

文档里对-C的描述是

-C, --create create the target database

我就以为它会自己创建数据库,然而不是的,参考 why pg_restore ignores –create?

-C-d一起用的时候会,-d 后的数据库会被当作 launchpad 而不是目标。

所以要达到我的目的,最好就是先删除数据库,再重新创建数据库,然后再导入:

1
2
3
docker exec -u postgres [postgres_container] dropdb postgres
docker exec -u postgres [postgres_container] createdb postgres
docker exec -u postgres -i [postgres_container] pg_restore -d postgres < ~/db.backup


感觉我对 Docker 和 PostgreSQL 的理解都很浅……