Ответ 1
Попробуйте использовать оболочку для выполнения этой команды
sh -c 'foo < /usr/src/app/migrations/*.sql'
Полная команда:
psql --host=127.0.0.1 --username=foo sh -c 'foo < /usr/src/app/migrations/*.sql'
Я не могу понять, как читать содержимое файла из контейнера Docker. Я хочу выполнить содержимое файла SQL в моем контейнере PGSQL. Я пробовал:
docker exec -it app_pgsql psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql
Мое приложение установлено в /usr/src/app
. Но у меня есть ошибка:
bash:/usr/src/app/migrations/*.sql: нет такого файла или каталога
Кажется, что Bash интерпретирует этот путь как хост-путь, а не гостевой. Действительно, выполнение команды в два раза отлично работает:
docker exec -it app_pgsql
psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql
Я думаю, что больше проблема Bash, чем у Docker, но я все еще застрял!:)
Попробуйте использовать оболочку для выполнения этой команды
sh -c 'foo < /usr/src/app/migrations/*.sql'
Полная команда:
psql --host=127.0.0.1 --username=foo sh -c 'foo < /usr/src/app/migrations/*.sql'
попробуйте sh -c "your long command"
Вы можете использовать клиента базы данных для подключения к контейнеру и перенаправления файла базы данных, затем вы можете выполнить восстановление.
Вот пример с MySQL: контейнер с MySQL, использующий сетевой стек хоста. Поскольку контейнер использует сетевой стек хоста (если у вас нет каких-либо ограничений на ваш MySQL или любую другую базу данных), вы можете подключаться через localhost и выполнять команды прозрачно
mysql -h 127.0.0.1 -u user -pyour_passwd database_name < db_backup.sql
Вы можете сделать то же самое с PostgresSQL (Восстановить файл резервной копии postgres с помощью командной строки?):
pg_restore --host 127.0.0.1 --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.backup"
Похоже, что "docker exec" не поддерживает перенаправление ввода. Я проверю это и, возможно, открою проблему для сообщества Docker в GitHub, если это применимо.