You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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脚本触发命令时连接失败,已验证所有变量均已正确设置。

可能的原因及解决办法
  1. Docker容器网络访问指向错误
    M1 Mac的Docker容器里,localhost指向容器自身而非宿主机。如果你的MySQL是跑在宿主机上,把dump_host改成host.docker.internal(Docker官方提供的宿主机映射域名),或者直接用宿主机的局域网IP,别用127.0.0.1或localhost。

  2. x86镜像的Rosetta转译兼容性问题
    你用的mysql:8.0默认是x86架构镜像,在M1的ARM芯片上靠Rosetta转译运行,可能存在网络连接的隐性bug。换成ARM原生镜像试试,比如mysql:8.0-arm64v8,或者直接用mysql:latest(现在官方镜像已经适配ARM)。

  3. 环境变量未正确传递到mise的脚本环境
    虽然你确认了变量设置,但mise运行脚本时的环境可能和终端不一致。在脚本开头加一行日志输出:

    echo "current_environment: $current_environment, dump_host: $dump_host, dump_port: $dump_port" >> /tmp/mysqldump_debug.log
    

    对比终端手动输出这些变量的结果,看看有没有被mise的环境覆盖或遗漏。

  4. 密码参数的特殊字符解析问题
    如果你的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}
    
  5. 管道缓冲导致的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:13:14