2017-01-10 6 views
1

Я бегу Docker контейнер с Laravel 5 и я PostgreSQL на моей машине.Laravel Docker не может выполнить PostgreSQL pg_restore

Все работает отлично, за исключением того, что у меня есть waaaay для многих данных на моей БД, и это сделало посев занятием около 1 часа. Обходной путь, который я придумал, заключается в том, чтобы восстановить резервный файл (только данные), который засеял бы базу данных для меня примерно через 5 мин.

Awesome! Но ...

Laravel работает внутри контейнера Докер, и PostgreSQL не является, поэтому, когда Laravel делает

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

    exec($cmd); 

Я получаю сообщение об ошибке, что нет pg_restore выполнить.

sh: 1: pg_restore: not found 

Итак, наконец, мой вопрос: Как я могу сделать Laravel, чтобы быть в состоянии выполнить pg_restore?

Обс: он работает, когда также работает Laravel на машине, но мне действительно нужно решить его с помощью Laravel на докере и postgres снаружи.

Заранее благодарен!

UPDATE:

Я Editted в Докер-compose.yml и добавил следующую строку в разделе объемов

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

Теперь ошибка просто

sh: 1: pg_restore: Permission denied 

Это означает, теперь он «видит» команду pg_restore, но не имеет прав на ее выполнение, поскольку он работает внутри контейнера докеров ... как я могу решить эту проблему?

ответ

1

Только что нашел решение: Установите postgres в файл Dockerfile. Теперь он может восстанавливать базы данных, поскольку в нем установлен pg_restore. Запустите команду pg_restore изнутри докера, но используя те же параметры из файла .env для подключения.

UPDATE:

Миграция теперь делает

$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); 

и он работает просто отлично!

+0

Вот что я имел в виду;) – user2105103

0

UPDATE

Другие ответы об установке инструментов на контейнер. Я предлагаю вам не делать этого, пока вы ищете правильный путь. Установка избыточных инструментов в контейнеры является нарушением принципа разделения, введенного контейнерами.

Обычным способом решения таких проблем является использование необходимых инструментов снаружи контейнера, когда это возможно, используя возможность работы по сети. И pg_restore позволяет это сделать.


Вы можете запустить pg_restore с внешней стороны контейнера.

Согласно pg_restore --help, вы можете дополнительно указать данные хоста, такие как имя хоста, порт и т. Д. Машины, которую вы хотите запустить pg_restore. Таким образом, все, что вам нужно, это узнать IP вашего контейнера и открыть порт PostgreSQL снаружи (который у вас уже есть, насколько я вижу).

Быстрый сниппет:

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

Спасибо за ответ. Это не сработает, поскольку сама проблема заключается в том, что контейнер php не может выполнить pg_restore. Может быть, это сработает, если я также последую за ответом @ user2105103 –

+0

Он будет работать до тех пор, пока вы запускаете 'pg_restore' с хоста, а не из контейнера. –

+0

Как сказано в вопросе, я должен запустить его из контейнера ... Это часть проблемы, и ее нельзя изменить. . –

1

Установите инструменты, необходимые -inside- контейнер, если вы хотите, чтобы запустить их из -inside- контейнера.

Так что, даже если вы не хотите запускать процесс базы данных, вам все равно нужны инструменты. Установите его.

+0

Я Editted докер-compose.yml и добавил следующую строку в разделе томов **/USR/бен/pg_restore:/USR/бен/pg_restore ** Теперь ошибка просто ** ш: 1: pg_restore : Permission denied ** Это означает, что теперь он «видит» команду pg_restore, но не имеет прав на ее выполнение, поскольку он работает внутри контейнера докеров ... как я могу решить эту проблему? –

+0

Я не думаю, что «установить» означает для меня, что это значит для вас. Как вы думаете, вы могли бы пощекотать pg_restore на USB-накопителе и запустить его где угодно? – user2105103

+0

Тогда, пожалуйста, опишите, что вы имеете в виду. –