【问题标题】:Bash / Docker exec: file redirection from inside a containerBash / Docker exec:来自容器内部的文件重定向
【发布时间】:2015-10-04 22:46:19
【问题描述】:

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

【问题讨论】:

  • 将整个命令字符串单引号。

标签: bash docker


【解决方案1】:

尝试使用 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'

【讨论】:

  • 也许我遗漏了一些东西,但对我来说这不是完整的命令。在现有的正在运行的 Docker 容器中运行某些东西的命令肯定是以 docker exec 开头的吗?
  • @brendan 我同意,我已经相应地编辑了答案。
  • 我又可能错了,这对我来说仍然很有趣。现在写命令的方式,会不会 sh、-c 和单引号文本不是 psql 的参数,解释为 Postgres 数据库名称和the -c option of psql?
  • @brendan 不确定:你能测试一下吗?
  • 我自己没有使用 Postgres 容器。我可以试试
【解决方案2】:

试试sh -c "your long command"

【讨论】:

  • 有点晚了 ;) 但我同意。我在涉及管道或重定向的任何时候都使用它。
  • 是的,你比我快 :-)
  • 你是我的 SAVIYAAAAH! +1,我正在写入 docker 容器内的文件,这种技术有效。 docker exec -t CONTAINER_ID sh -c 'echo "Hello World" &gt; TestFiles/test_user/test_file.txt'
  • 这是要走的路!谢谢
【解决方案3】:

在将备份传输到 mysql 命令时也可以使用:

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

【讨论】:

    【解决方案4】:

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

    这是一个 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 社区打开一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2019-05-25
      • 1970-01-01
      相关资源
      最近更新 更多