我正在学习 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/