MySQL 8.0 容器在群晖上启动失败的三个硬性条件是:必须设置非空且不含特殊字符的 MYSQL_ROOT_PASSWORD;宿主机挂载路径必须映射到容器内 /var/lib/mysql;端口映射必须显式填写如 3306:3306,缺一不可。

MySQL 8.0 容器启动失败的三个硬性条件
群晖上 MySQL 容器起不来,90% 是卡在这三件事没做:没设 MYSQL_ROOT_PASSWORD、挂载路径不是 /var/lib/mysql、端口没手动填 3306:3306。缺一不可,跳过任意一个,容器都会反复重启或直接退出。
-
MYSQL_ROOT_PASSWORD必须是非空字符串,且不能含@、$、#等符号——DSM 图形界面会截断或转义,导致实际为空,日志只报Initialization of mysqld failed - 宿主机挂载路径(如
/volume1/docker/mysql8/data)必须映射到容器内/var/lib/mysql,映射成/data或/mysql都无效,因为 MySQL 8.0 镜像硬编码了该路径 - 端口映射必须显式填写
3306:3306(或3307:3306),禁用“自动”——自动模式常分到32768–32775这类高位端口,Navicat、Java 应用默认连:3306,根本找不到服务
远程连接被拒绝?先查 caching_sha2_password 和 % 用户
容器跑着、端口开着、密码没错,但就是连不上——大概率是 MySQL 8.0 默认 root 只允许 localhost 登录,且认证插件是 caching_sha2_password,而 Navicat、HeidiSQL、旧版 Workbench 不原生支持。
- 别改
root用户的认证方式,DSM 某些组件依赖它;应新建一个admin用户并指定mysql_native_password插件:CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_pass'; - 授予权限后必须执行
FLUSH PRIVILEGES;,否则权限不生效 - 确认防火墙已放行你设的本地端口(比如
3307),不是容器端口3306;外网访问时,路由器端口转发目标也得指向 NAS 的这个本地端口
字符集和远程访问必须靠 custom.cnf 挂载
DSM 图形界面不提供编辑 my.cnf 的入口,但 MySQL 8.0 默认用 latin1,插入中文直接报错,且默认关闭远程访问——这两个问题不解决,数据库等于半残。
- 在 NAS 上建目录
/volume1/docker/mysql8/conf,里面放custom.cnf,内容至少含[mysqld]段:character-set-server=utf8mb4collation-server=utf8mb4_unicode_cibind-address=0.0.0.0 - 挂载时,把
/volume1/docker/mysql8/conf映射到容器内/etc/mysql/conf.d(不是/etc/mysql/my.cnf!后者会被忽略) - 首次登录后运行
SHOW VARIABLES LIKE 'char%';,确认输出全是utf8mb4,否则配置没生效
数据持久化失效的真正原因在权限
删容器后数据没了,或者容器启动就退出,往往不是挂载路径错了,而是群晖 ACL 权限没开足——MySQL 进程写不了文件,直接崩。
- 在 DSM「控制面板 → 共享文件夹」中,右键你的 MySQL 数据目录(如
mysql8/data)→「编辑 → 权限」→ 勾选「所有人」的「读取/写入」,并「应用至所有子文件夹」 - 别用系统默认的
/docker根目录直接挂载,它可能被 DSM 自身服务占用或受 ACL 限制;单独建个共享文件夹更稳 - 挂载后进容器执行
ls -l /var/lib/mysql,确认目录属主是mysql:mysql,且有写权限;若报Permission denied,一定是宿主机权限没放开
custom.cnf 必须挂到 /etc/mysql/conf.d,everyone 写权限必须打到子目录,以及 mysql_native_password 用户必须显式创建——这三处出错,前面全白搭。


















