将PostgreSQL数据库备份加载到Docker /初始Docker数据中

时间:2014-07-28 13:04:52

标签: postgresql backup docker

我正在将应用程序迁移到Docker中。我遇到的一个问题是将初始数据加载到Docker中运行的PostgreSQL的正确方法是什么?我恢复数据库备份文件的典型方法无效。我尝试了以下方法:

gunzip -c mydbbackup.sql.gz | psql -h <docker_host> -p <docker_port> -U <dbuser> -d <db> -W

这不起作用,因为PostgreSQL提示输入密码,我无法输入密码,因为它正在从STDOUT读取数据。我不能使用$ PGPASSWORD环境变量,因为我在主机中设置的任何环境变量都没有在我的容器中设置。

除了使用-f标志外,我还尝试了类似的命令,并指定了sql备份文件的路径。这不起作用,因为我的文件不在我的容器上。我可以使用我的Dockerfile中的ADD语句将文件复制到我的容器中,但这似乎不对。

所以,我问社区。将PostgreSQL数据库备份加载到Docker容器中的首选方法是什么?

1 个答案:

答案 0 :(得分:3)

  

我不能使用$ PGPASSWORD环境变量,因为any   我在我的主机中设置的环境变量未在我的容器中设置。

我没有使用docker,但是您的容器在显示的命令中看起来像一个远程主机,psql在本地运行。因此,永远不必在远程主机上设置PGPASSWORD,只能在本地设置。

如果问题归结为向此命令添加密码:

gunzip -c mydbbackup.sql.gz |
  psql -h <docker_host> -p <docker_port> -U <dbuser> -d <db> -W

你可以使用多种方法提交它(在所有情况下,不要使用-W选项来psql)

  • 在调用中硬编码:

     gunzip -c mydbbackup.sql.gz |
      PGPASSWORD=something psql -h <docker_host> -p <docker_port> -U <dbuser> -d <db>
    
  • 键入键盘

     echo -n "Enter password:"
     read -s PGPASSWORD
     export PGPASSWORD
     gunzip -c mydbbackup.sql.gz |
       psql -h <docker_host> -p <docker_port> -U <dbuser> -d <db>
    

请注意psql的-W--password选项。

这个选项的要点是要求首先输入密码,即使上下文不需要它。

它经常被误解为等同于mysql的-p选项。这是一个错误:在受密码保护的连接上需要-p-W永远不需要,并且在编写脚本时实际上会妨碍。

       -W, --password
           Force psql to prompt for a password before connecting to a
           database.

           This option is never essential, since psql will automatically
           prompt for a password if the server demands password
           authentication. However, psql will waste a connection attempt
           finding out that the server wants a password. In some cases it is
           worth typing -W to avoid the extra connection attempt.