linux - 将文件内容传递给 docker exec
问题描述
我正在学习 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 并尝试从容器内部加载该文件存在问题。我该怎么做?
解决方案
当然,有不止一种方法可以做到这一点;您的大多数调用都是关闭的,但是如果您执行 docker ,-t
它将为 i/o 分配一个终端,这将干扰流操作。
我最近从 shell 历史调用是:
docker exec -i mysql mysql -t < t.sql
就我而言,当然mysql
是正在运行的容器名称。你会注意到我没有传递-t
给docker exec
- 但是我将它传递给mysql
我在 docker 主机上执行的命令行程序,所以不要在那里感到困惑。
解释该命令并执行 docker 的 shell 也是打开t.sql
文件描述符并将其重定向到标准输入的 shell docker
,所以t.sql
这里是在主机 shell 的当前工作目录中,而不是容器 shell。
话虽如此,这就是为什么你的不起作用。首先,正如我所说,使用exec -it
分配了一个终端,该终端会干扰 bash shell 从中设置的标准输入流cat
。其次,你真的很接近,但 path/file.sql 不在 docker 映像上,所以我猜这会抛出“没有这样的文件或目录”,因为file.sql
它在主机上,而不是容器上它-c
在容器sh
执行的参数中被引用。当然,这也需要-t
删除;在这两种情况下都不需要分配终端(您已经有一个终端,并且它已经是 docker 执行的标准输出,因为它将继承 shell 的未重定向标准输出)。
推荐阅读
- javascript - 在多次调用的函数中递减变量
- java - 连接 websocket(Sockjs、stomp-websocket)时出现 CORS 错误(Access-Control-Allow-Origin)
- joomla - 网站显示原始源代码-但谷歌没有
- angular - 单元测试延迟加载模块路由
- c# - 如何在 C# 中彩色打印 word 文档?
- ios - iPhone 设备中的音频和视频合并不起作用。在 AVAssestTrack 初始化中,音频和视频的模拟器合并需要时间
- c# - C# 引用格式字符串中的变量类型、名称和值
- python - python struct unpack bad char
- bash - 在不使用 ssh 的情况下使 bash 脚本可用
- python - 如何将循环分成几个阶段