将文件内容传递给 docker exec
Posted
技术标签:
【中文标题】将文件内容传递给 docker exec【英文标题】:Pass file content to docker exec 【发布时间】:2019-05-25 20:13:21 【问题描述】:我正在学习 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 并尝试从容器内部加载该文件存在问题。我该怎么做?
【问题讨论】:
Stack Overflow 是一个编程和开发问题的网站。对于这个问题,您应该使用Stack Exchange network 上的另一个站点。 【参考方案1】:当然,有不止一种方法可以做到这一点;您的大多数调用都已关闭,但如果您使用-t
执行 docker,它将为 i/o 分配一个终端,这将干扰流操作。
我最近从 shell 历史调用是:
docker exec -i mysql mysql -t < t.sql
在我的情况下,mysql
当然是正在运行的容器名称。您会注意到我确实不将-t
传递给docker exec
- 但是我将它传递给我在docker 主机上执行的mysql
命令行程序,所以不要得到那里很困惑。
解释该命令并执行docker的shell也是打开t.sql
并将该文件描述符重定向到docker
的标准输入的shell,所以t.sql
这里是在主机shell的当前工作目录中,不是容器外壳。
话虽如此,这就是你的不起作用的原因。首先,正如我所说,exec -it
的使用分配了一个终端,该终端会干扰 bash shell 从cat
设置的标准输入流。其次,你真的很接近,但 path/file.sql 不在 docker 映像上,所以我猜这会抛出“没有这样的文件或目录”,因为 file.sql
在主机上,而不是容器,但它在 -c
参数中被引用到容器的 sh
执行。当然,这也需要删除-t
;在这两种情况下都不需要分配终端(您已经有一个终端,并且它已经是 docker 执行的标准输出,因为它将继承 shell 的未重定向标准输出)。
【讨论】:
嗨,丹,文件重定向和终端都可以工作吗?假设数据库需要使用密码登录,我们不想在docker exec -i something mysql -u root -proot
这样的命令行界面输入密码,而是使用docker exec -it something mysql -u root -p
然后输入密码。之后使用文件输入< t.sql
。通常就像“在我们进行一些交互后延迟重定向”,这可能吗?非常感谢您!
我不知道有一种方法可以将正在运行的进程的输入流从终端更改为文件。我建议你可以在 ~/.my.cnf 中放一个 mysql 密码,对你来说是 /root/.my.cnf。以上是关于将文件内容传递给 docker exec的主要内容,如果未能解决你的问题,请参考以下文章
读取 UTF-8 文件,使用 SendInput 将内容传递给其他应用程序