Bash / Docker exec:从容器内部重定向文件

时间:2015-07-15 18:17:43

标签: bash docker

我无法弄清楚如何从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问题,但我仍然被卡住了! :)

4 个答案:

答案 0 :(得分:32)

尝试并使用shell来执行该命令

sh -c 'psql --host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'

完整的命令是:

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

答案 1 :(得分:14)

尝试使用sh -c "your long command"

答案 2 :(得分:1)

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

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

mysql -h 127.0.0.1 -u user -pyour_passwd database_name < db_backup.sql

您也可以使用PostgresSQL Restore a postgres backup file using the command line?):

pg_restore --host 127.0.0.1 --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.backup"

似乎“docker exec”不支持输入重定向..我将验证这一点,如果适用,可能会在GitHub上为Docker社区打开一个问题。

答案 3 :(得分:0)

在将备份传递到mysql命令时也可以工作:

cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE