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

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

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

这是行不通的,因为PostgreSQL提示input密码,而且我不能input密码,因为它是从STDOUT读取数据的。 我不能使用$ PGPASSWORD环境variables,因为我的主机中设置的任何环境variables没有设置在我的容器中。

我也尝试了上面类似的命令,除了使用-f标志,并指定一个sql备份文件的path。 这不起作用,因为我的文件不在我的容器上。 我可以使用我的Dockerfile中的ADD语句将文件复制到我的容器中,但这看起来不正确。

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

我不能使用$ PGPASSWORD环境variables,因为我的主机中设置的任何环境variables没有设置在我的容器中。

我没有使用docker,但是你的容器看起来像所示命令中的远程主机,而psql在本地运行。 所以PGPASSWORD永远PGPASSWORD在远程主机上设置,只能在本地设置。

如果问题归结为为此命令添encryption码:

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

你可以使用几种方法提交它(在任何情况下,不要使用psql的-W选项)

  • 在调用中硬编码:

      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选项。

这个选项的要点是要求input密码,即使上下文不需要密码。

它经常被误解为相当于mysql的-p选项。 这是一个错误:在密码保护的连接上需要-p-W从不需要,实际上是在脚本编写的时候。

        -W, - 密码
           强制psql在连接到之前提示input密码
           数据库。

           这个选项从来不是必需的,因为psql会自动的
           如果服务器要求密码,则提示input密码
           authentication。 但是,psql会浪费连接尝试
           发现服务器需要密码。 在某些情况下,它是
           值得键入-W来避免额外的连接尝试。