我正在学习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并试图从容器内部加载该文件的问题。我该怎么办?
答案 0 :(得分:5)
当然,有多种方法可以做到这一点;您的大多数调用都已结束,但如果您使用-t
执行docker,它将为i / o分配一个终端,这将干扰流的出现。
我最近从shell历史中调用的是:
docker exec -i mysql mysql -t < t.sql
在我的情况下, mysql
是运行中的容器名称。您会注意到,我没有将-t
传递给docker exec
-但是我确实将其传递给了我在docker主机上执行的mysql
命令行程序,所以不要在这里感到困惑。
解释该命令并执行docker的外壳程序也是打开t.sql
并将该文件描述符重定向到docker
的stdin的外壳程序,因此t.sql
在当前工作中主机外壳的目录,而不是容器外壳的目录。
话虽如此,这就是为什么你的不工作。首先,正如我所说,exec -it
的使用分配了一个终端,该终端会干扰bash shell从cat
设置的stdin流。其次,您确实很接近,但是path / file.sql不在docker映像上,所以我猜想是因为file.sql
在主机上,所以抛出了“没有这样的文件或目录”,而不是容器,但是在容器的-c
执行的sh
参数中引用了它。当然,这还需要删除-t
;在两种情况下都不需要分配终端(您已经有一个终端,并且它将已经成为docker执行的标准输出,因为它将继承shell的未重定向的标准输出)。