Docker Compose导入MySQL失败:TTY设备错误及命令用法问题求助
解决Docker Compose导入SQL到MySQL容器的TTY错误问题
我来帮你搞定这个问题!你遇到的错误核心是docker-compose exec默认会分配伪终端(TTY),而当你用<重定向输入时,TTY和标准输入的交互产生了冲突。另外你之前可能把参数位置搞错了——docker-compose exec的选项要放在服务名/容器名之前,不是命令后面,这才导致了用法提示报错。
正确的命令写法(直接解决问题)
把-T参数(禁用TTY分配)放在exec和容器名之间,同时注意密码的写法(-p后面直接跟密码,不要留空格,避免触发交互输入):
docker-compose exec -T MYSQL_CONTAINERNAME mysql -uroot -p你的数据库密码 --database=MY_DB < /code/export_new.sql
如果不想在命令行明文写密码,用环境变量更安全:
MYSQL_PWD=你的数据库密码 docker-compose exec -T MYSQL_CONTAINERNAME mysql -uroot --database=MY_DB < /code/export_new.sql
替代方案1:用docker exec代替docker-compose exec
有时候docker exec的参数逻辑更直观,只需要加-i保持标准输入打开即可:
docker exec -i MYSQL_CONTAINERNAME mysql -uroot -p你的数据库密码 --database=MY_DB < /code/export_new.sql
替代方案2:先拷贝SQL文件到容器再导入
如果你的SQL文件在宿主机上,也可以先把文件拷贝到容器内部,再执行导入:
- 拷贝文件到容器:
docker-compose cp /宿主机上的文件路径/export_new.sql MYSQL_CONTAINERNAME:/tmp/export_new.sql
- 在容器内执行导入:
docker-compose exec MYSQL_CONTAINERNAME mysql -uroot -p你的数据库密码 MY_DB < /tmp/export_new.sql
或者用source命令更简洁:
docker-compose exec MYSQL_CONTAINERNAME mysql -uroot -p你的数据库密码 -e "source /tmp/export_new.sql" MY_DB
额外注意事项
- 确保目标数据库
MY_DB已经存在,如果不存在,先执行创建命令:
docker-compose exec MYSQL_CONTAINERNAME mysql -uroot -p你的数据库密码 -e "CREATE DATABASE IF NOT EXISTS MY_DB;"
- 确认容器处于运行状态,可以用
docker-compose ps查看容器状态。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

