pg_restore到在docker容器中运行的postgres

时间:2015-11-30 10:58:32

标签: postgresql docker docker-machine pg-restore

我有一个数据库的备份,我将恢复到在docker容器内运行的postgres数据库。

我在OS X上使用的是docker-machine 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

3 个答案:

答案 0 :(得分:1)

似乎没有合适的解决方案在运行时执行此操作,但是将转储文件复制到了容器中:

docker cp dumpfile DBcontainer:/dumpfile

并从容器内还原:

docker  exec -i -t DBcontainer /bin/bash
psql DBname < dumpfile

一次使用效果很好...

答案 1 :(得分:0)

也许是因为你必须单独指定主机和端口?

-h `docker-machine ip default` -p 5432

请参阅docs

答案 2 :(得分:0)

您必须使用连接字符串,例如docker-compose exec fooapp pg_restore --verbose --clean --no-acl --no-owner -d $DATABASE_URL foo.dump

以下对我有用:

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

对于额外的积分,你可以创建一个rake任务(假设你正在使用Rails应用程序),如下所示:

lib/tasks

将该文件放入docker-compose exec fooapp bundle exec rails db:import[foo.dump] ,然后您可以调用类似的内容:

{{1}}