Bash / Docker exec:从容器内部进行文件redirect

我无法弄清楚如何从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:没有这样的文件或目录

看来,巴什解释这条道路是一个主人的path,而不是客人。 事实上,两次执行这个命令是完美的:

 docker exec -it app_pgsql psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql 

我认为这是一个比Docker更多的Bash问题,但我仍然卡住! 🙂

尝试使用一个shell来执行该命令

 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"

您可以使用数据库客户端连接到您的容器并redirect数据库文件,然后您可以执行还原。

下面是MySQL的一个例子 :使用主机networking堆栈运行MySQL的容器。 由于容器正在使用主机networking堆栈(如果您对MySQL或任何数据库没有任何限制),则可以通过本地主机进行连接,并透明地执行命令

 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执行”不支持inputredirect..我会validation这一点,也许在GitHub的Docker社区,如果适用,可能会打开一个问题。