我有一个数据库的备份,我想将其恢复到docker容器中运行的postgres数据库中。
我在OS X上使用docker机器。
Postgres图片为postgres:9.4
。
这是我到目前为止想出的脚本:
pg_restore --verbose --clean --no-acl --no-owner
-h tcp://`docker-machine ip default`:5432
-U postgres
-d tonsser-api_development latest.dump
但这行不通。我得到错误:
pg_restore: connecting to database for restore
pg_restore: [archiver (db)] connection to database "tonsser-api_development" failed: could not translate host name "tcp://192.168.99.100:5432" to address: nodename nor servname provided, or not known
在运行时似乎没有合适的解决方案来做到这一点,但是将转储文件复制到容器:
docker cp dumpfile DBcontainer:/dumpfile
并从容器内恢复:
docker exec -i -t DBcontainer /bin/bash
psql DBname < dumpfile
一次性使用效果良好。。。
您必须使用连接字符串,例如$DATABASE_URL
以下对我来说很好:
docker-compose exec fooapp pg_restore
--verbose --clean --no-acl --no-owner
-d $DATABASE_URL foo.dump
对于额外的点数,您可以创建一个rake任务(假设您使用的是Rails应用程序),如下所示:
namespace :db do
desc 'Import a given file into the database'
task :import, [:path] => :environment do |_t, args|
dump_path = args.path
system 'pg_restore --verbose --clean --no-acl --no-owner -d $DATABASE_URL '
+ dump_path
end
end
把这个文件放在lib/tasks
中,然后你可以调用类似的东西:
docker-compose exec fooapp bundle exec rails db:import[foo.dump]
也许是因为必须分别指定主机和端口?
-h `docker-machine ip default` -p 5432
参见文档