Laravel Docker无法执行PostgreSQL pg_restore

我使用Laravel 5运行Docker容器,并且在我的机器上安装了PostgreSQL

一切都很完美,除了我可以在我的数据库上获得许多数据,并且使播种需要大约1个小时。 我想到的解决方法是恢复一个备份文件(仅数据),将在大约5分钟为我的数据库种子。

真棒! 但…

Laravel运行在Docker容器中,PostgreSQL不在Laravel中

$cmd = "pg_restore -v -U pgadmin -d $database $path"; exec($cmd); 

我得到一个错误,说没有pg_restore执行。

  sh: 1: pg_restore: not found 

所以,最后,我的问题是: 我怎样才能使Laravel能够执行pg_restore?

Obs:在机器上运行Laravel的时候也行,但是我真的需要用Laravel在docker和postgres之外解决这个问题。

提前致谢!

更新:

我编辑了docker-compose.yml并在卷下添加了以下行

 ./usr/bin/pg_restore:/usr/bin/pg_restore 

现在错误只是

 sh: 1: pg_restore: Permission denied 

这意味着现在它“看到”pg_restore命令,但没有执行它的权限,因为它运行在docker集装箱内……我该如何解决这个问题?

安装所需的工具 – 如果要从容器内部运行它们,请在容器内部安装。

所以即使你不想运行数据库进程,你仍然需要这些工具。 安装它。

刚刚find解决scheme:在Dockerfile上安装postgres。 现在可以恢复数据库了,因为pg_restore已经安装了。 从docker内部触发pg_restore命令,但使用.env文件中的相同参数进行连接。

更新:

现在迁移了

  $database = 'database_name'; $path = __DIR__ . "/database.backup"; $ip = env('DB_HOST'); $port = env('DB_PORT'); $passw = env('DB_PASSWORD'); $cmd = "PGPASSWORD=\"$passw\" pg_restore -h $ip -p $port -v -U pgadmin -d $database $path"; exec($cmd); 

它工作得很好!

UPDATE

其他答案是关于安装工具到你的容器。 我build议你不要这样做,只要你正在寻找一个正确的方法。 将冗余工具安装到容器中违反了容器引入的关注原则的分离。

解决此类问题的常用方法是尽可能使用容器外部所需的工具,利用networking上的工作能力。 而pg_restore可以让你这样做。


您可以从容器的外部运行pg_restore

根据pg_restore --help ,还可以指定要运行pg_restore的计算机的主机数据,例如主机名,端口等。 因此,您只需要知道容器的IP,并将PostgreSQL端口暴露在外面(您已经知道了,就像我看到的那样)。

快速的片段:

 pg_restore -h HOST_IP -p HOST_PORT -U USER -W PASSWORD