M1 Mac下通过Mise脚本运行Docker容器连接MySQL失败排查
我使用搭载M1处理器的MacBook Pro,通过mise运行bash脚本创建Docker容器,脚本内容如下:
#!/usr/bin/env bash #MISE description="dump environment schema" docker run --rm --name mysqldump-${current_environment} mysql:8.0 mysqldump \ --host=${dump_host} \ --user=${dump_user} \ --password=${dump_password} \ --port=${dump_port} \ --no-data --routines --triggers dzdb | sed 's/ AUTO_INCREMENT=[0-9]*//g' >>${dump_file}
运行该脚本时持续遇到两个错误:
- Error: mysql: query system variables: driver: bad connection
- [mysql] connection.go:49: unexpected EOF
容器可正常创建,且我能在终端中正常连接MySQL,但通过该bash脚本触发命令时连接失败,已验证所有变量均已正确设置。
Docker容器网络访问指向错误
M1 Mac的Docker容器里,localhost指向容器自身而非宿主机。如果你的MySQL是跑在宿主机上,把dump_host改成host.docker.internal(Docker官方提供的宿主机映射域名),或者直接用宿主机的局域网IP,别用127.0.0.1或localhost。x86镜像的Rosetta转译兼容性问题
你用的mysql:8.0默认是x86架构镜像,在M1的ARM芯片上靠Rosetta转译运行,可能存在网络连接的隐性bug。换成ARM原生镜像试试,比如mysql:8.0-arm64v8,或者直接用mysql:latest(现在官方镜像已经适配ARM)。环境变量未正确传递到mise的脚本环境
虽然你确认了变量设置,但mise运行脚本时的环境可能和终端不一致。在脚本开头加一行日志输出:echo "current_environment: $current_environment, dump_host: $dump_host, dump_port: $dump_port" >> /tmp/mysqldump_debug.log对比终端手动输出这些变量的结果,看看有没有被mise的环境覆盖或遗漏。
密码参数的特殊字符解析问题
如果你的MySQL密码包含特殊字符(比如&、空格、引号),直接用--password=${dump_password}会导致参数解析错误。可以改用短参数写法-p"${dump_password}",或者把密码写到本地的~/.my.cnf文件里,然后在docker run命令中挂载这个文件到容器的/root/.my.cnf,这样mysqldump会自动读取密码,避免参数解析问题:docker run --rm --name mysqldump-${current_environment} -v ~/.my.cnf:/root/.my.cnf mysql:8.0 mysqldump \ --host=${dump_host} \ --user=${dump_user} \ --port=${dump_port} \ --no-data --routines --triggers dzdb | sed 's/ AUTO_INCREMENT=[0-9]*//g' >>${dump_file}管道缓冲导致的EOF异常
mysqldump输出通过管道传给sed时,可能因为缓冲机制导致连接提前断开触发EOF。给mysqldump加上--quick参数减少缓冲:mysqldump --quick --no-data --routines --triggers dzdb或者先把mysqldump的输出写到临时文件,再用sed处理后追加到目标文件,绕开管道缓冲问题:
temp_file=$(mktemp) docker run --rm --name mysqldump-${current_environment} mysql:8.0 mysqldump \ --host=${dump_host} \ --user=${dump_user} \ --password=${dump_password} \ --port=${dump_port} \ --no-data --routines --triggers dzdb > "$temp_file" sed 's/ AUTO_INCREMENT=[0-9]*//g' "$temp_file" >> "${dump_file}" rm "$temp_file"
内容的提问来源于stack exchange,提问作者Eduardo

