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

39

我不知道如何从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问题,但我仍然卡住了! :)


用单引号引用整个命令字符串。 - Etan Reisner
4个回答

65

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

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'

也许我漏掉了什么,但在我看来那不是完整的命令。肯定在已经运行的 Docker 容器内运行某些东西的命令以 docker exec 开头吧? - brendan
@brendan 我同意,我已相应地编辑了答案。 - VonC
我可能错了,但这对我来说仍然很有趣。现在命令的编写方式,sh、-c和单引号文本不会被解释为psql的参数,而是作为Postgres数据库名称和psql的-c选项(https://www.postgresql.org/docs/9.3/static/app-psql.html)的解释吗? - brendan
@brendan 不确定:你能测试一下吗? - VonC
我自己没有使用Postgres容器。我可以尝试一下。 - brendan
显示剩余6条评论

19

尝试使用sh -c "您的长命令"


有点晚了 ;) 但我同意。每当涉及管道或重定向时,我都会使用它。 - VonC
是的,你比我快了 :-) - user2915097
你是我的救星!+1,我正在一个 Docker 容器内写入文件,这种技术可行。docker exec -t CONTAINER_ID sh -c 'echo "Hello World" > TestFiles/test_user/test_file.txt' - Jayant Bhawal
这是正确的方式!谢谢。 - emmdee

3

还可以在备份时通过管道命令发送到mysql:

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


1
您可以使用数据库客户端连接到容器并重定向数据库文件,然后执行还原操作。
以下是使用MySQL的示例:运行MySQL的容器,使用主机网络堆栈。由于容器正在使用主机网络堆栈(如果您没有任何限制,例如MySQL或其他数据库),因此可以通过localhost连接并透明地执行命令。
mysql -h 127.0.0.1 -u user -pyour_passwd database_name < db_backup.sql

你可以使用PostgreSQL完成相同的操作(如何使用命令行恢复PostgreSQL备份文件?):
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 社区开放问题,如果适用的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接