The*_*xyQ 2 unix linux shell command arguments
我正在学习Docker容器,我想使用docker exec将.sql文件传递到数据库。我怎样才能做到这一点?我现在搜索了大约一个小时,发现了以下内容:
cat file.sql | docker exec -it mariadb sh -c 'mysql -u<user> -p<pass>'
Run Code Online (Sandbox Code Playgroud)
或这个
docker exec -it mariadb sh -c 'mysql -u<user> -p<pass> "$(< /path/file.sql)"'
Run Code Online (Sandbox Code Playgroud)
但都没有用。我认为存在将其传递到sh -c并试图从容器内部加载该文件的问题。我该怎么做?
当然,有多种方法可以做到这一点;您的大多数调用都已结束,但是如果您执行docker,-t它将为i / o分配一个终端,这将干扰流的出现。
我最近从shell历史中调用的内容是:
docker exec -i mysql mysql -t < t.sql
Run Code Online (Sandbox Code Playgroud)
就我而言,当然mysql是运行中的容器名称。您会注意到,我没有传递-t给docker exec-但是我会将其传递给mysql我在docker主机上执行的命令行程序,因此不要在此处感到困惑。
解释该命令并执行docker的外壳程序也是打开t.sql该文件描述符并将其重定向到docker的stdin t.sql的外壳程序,因此这里位于主机外壳程序的当前工作目录中,而不是容器外壳程序中。
话虽这么说,这就是为什么你的不工作。首先,正如我所说,使用exec -it分配一个终端,该终端会干扰bash shell从其建立的stdin流cat。其次,您实际上已经关闭了,但是path / file.sql不在docker映像上,所以我猜是抛出了“没有这样的文件或目录”,因为file.sql它位于主机上,而不是容器上它在-c参数中被引用到容器的sh执行中。当然,这也需要-t删除;在两种情况下都不需要分配终端(您已经有一个终端,并且它将已经成为docker执行的标准输出,因为它将继承shell的未重定向的标准输出)。
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |