9

我有一个数据库备份,我想将其还原到在 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
4

3 回答 3

5

在运行时似乎没有适当的解决方案,但是将转储文件复制到容器:

docker cp dumpfile DBcontainer:/dumpfile

并从容器内恢复:

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

一次性使用效果很好...

于 2018-09-12T12:08:04.160 回答
1

您必须使用连接字符串,例如$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]
于 2017-10-21T08:33:28.093 回答
0

也许是因为您必须分别指定主机和端口?

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

查看文档

于 2015-11-30T11:47:38.833 回答