首页 > 解决方案 > 将文件内容传递给 docker exec

问题描述

我正在学习 docker 容器,我想使用 docker exec 将 .sql 文件传递​​给数据库。我怎样才能做到这一点?我现在正在搜索大约一个小时,发现了这个:

cat file.sql | docker exec -it mariadb sh -c 'mysql -u<user> -p<pass>'

或这个

docker exec -it mariadb sh -c 'mysql -u<user> -p<pass> "$(< /path/file.sql)"'

但都没有奏效。我认为我将它传递给 sh -c 并尝试从容器内部加载该文件存在问题。我该怎么做?

标签: linuxshellunixcommandarguments

解决方案


当然,有不止一种方法可以做到这一点;您的大多数调用都是关闭的,但是如果您执行 docker ,-t它将为 i/o 分配一个终端,这将干扰流操作。

我最近从 shell 历史调用是:

docker exec -i mysql mysql -t  < t.sql

就我而言,当然mysql是正在运行的容器名称。你会注意到我没有传递-tdocker exec- 但是我将它传递给mysql我在 docker 主机上执行的命令行程序,所以不要在那里感到困惑。

解释该命令并执行 docker 的 shell 也是打开t.sql文件描述符并将其重定向到标准输入的 shell docker,所以t.sql这里是在主机 shell 的当前工作目录中,而不是容器 shell。

话虽如此,这就是为什么你的不起作用。首先,正如我所说,使用exec -it分配了一个终端,该终端会干扰 bash shell 从中设置的标准输入流cat。其次,你真的很接近,但 path/file.sql 不在 docker 映像上,所以我猜这会抛出“没有这样的文件或目录”,因为file.sql它在主机上,而不是容器上它-c在容器sh执行的参数中被引用。当然,这也需要-t删除;在这两种情况下都不需要分配终端(您已经有一个终端,并且它已经是 docker 执行的标准输出,因为它将继承 shell 的未重定向标准输出)。


推荐阅读