Подтвердить что ты не робот

Bash/Docker exec: перенаправление файлов изнутри контейнера

Я не могу понять, как читать содержимое файла из контейнера 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, но я все еще застрял!:)

4b9b3361

Ответ 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'

Ответ 2

попробуйте sh -c "your long command"

Ответ 3

Вы можете использовать клиента базы данных для подключения к контейнеру и перенаправления файла базы данных, затем вы можете выполнить восстановление.

Вот пример с 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, если это применимо.