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社区,如果适用,可能会打开一个问题。