Docker MySQL容器内SQL文件存在但导入提示文件不存在
问题成因
Shell的重定向符<是由当前执行命令的宿主机Shell(也就是你用的zsh)负责解析的,不会被传入Docker容器内部执行。
你执行的报错命令里,zsh会优先在宿主机本地文件系统查找/var/lib/mysql/mysql-pubsub-3.2.0.sql这个路径,而这个文件实际存放在Docker容器的独立文件系统里,宿主机上不存在对应路径,因此抛出文件不存在的错误。
之前执行docker exec -it docker-mysql ls 路径能成功返回结果,是因为ls命令本身运行在容器内部,读取的是容器的文件系统,和重定向的解析逻辑完全不同。
可行解决方法
你可以根据实际场景任选以下一种方案操作:
- 方案1:让重定向逻辑在容器内部解析
用bash -c把整条MySQL执行命令包裹起来,让包括重定向在内的整条逻辑都在容器的Shell环境中执行,注意执行时不需要分配交互终端,把参数里的-t去掉,同时MySQL的-p参数和密码之间不要加空格,避免参数解析错误:docker exec -i docker-mysql bash -c "mysql -u XXX -p'XXXX' < /var/lib/mysql/mysql-pubsub-3.2.0.sql" - 方案2:直接从宿主机挂载本地SQL文件导入
如果SQL文件本身存放在宿主机上,不需要提前拷贝进容器,直接在宿主机侧做重定向,把本地SQL文件流通过管道传给容器内的MySQL进程即可:docker exec -i docker-mysql mysql -u XXX -p'XXXX' < /你本地宿主机上/存放SQL文件的/实际路径.sql - 方案3:进入容器内部手动执行导入
先进入容器的交互式终端:
连接进入MySQL命令行后,用docker exec -it docker-mysql bashsource命令加载容器内的SQL文件完成导入:mysql -u XXX -p'XXXX' source /var/lib/mysql/mysql-pubsub-3.2.0.sql;
内容的提问来源于stack exchange,提问作者Ahmet Karakaya
相关产品推荐
相关产品推荐

