linux - 将文件内容传递给 docker exec

标签 linux shell unix command arguments

我正在学习 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 并尝试从容器内部加载该文件是有问题的。我该怎么做?

最佳答案

当然,方法不止一种;您的大多数调用都很接近,但是如果您使用 -t 执行 docker,它将为 i/o 分配一个终端,这将干扰流操作。

我最近对 ​​shell 历史的调用是:

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

当然,在我的例子中,mysql 是正在运行的容器名称。你会注意到我没有-t传递给docker exec - 但是我确实将它传递给mysql 我在 docker 主机上执行的命令行程序,所以不要在那里混淆。

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

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

关于linux - 将文件内容传递给 docker exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53951136/

相关文章:

ec2 实例上的 linux cli 选项卡自动完成中断

linux - 在文本文件中查找行号 - 无需打开文件

linux - 定义引用其他别名的别名

linux - 使用 CUPS 打印,我的应用程序什么时候可以退出?

android - 当我按 ctrl+space 时 Eclipse 崩溃了

Python安装版本不显示(Python 2.7.10)

linux - UNIX下如何将两个命令合二为一?

java - 通过 bash 脚本执行 jar 文件

shell - 需要查看24小时内哪些文件已更改并发送电子邮件(Shell脚本)

linux - 在 Linux 中将大目录拆分为较小的目录