必须手动设置4个环境变量:mysql_root_password(非空无特殊字符)、mysql_initdb_skip_tzinfo=1、mysql_allow_empty_password=no、mysql_default_authentication_plugin=caching_sha2_password;端口映射须手动填3306:3306;挂载路径必须为/volume1/docker/mysql8/data→/var/lib/mysql且chown 999:999;中文乱码和远程访问需挂载custom.cnf配置文件。

Container Manager 启动 MySQL 8.0 容器必填的 4 个环境变量
群晖 DSM 7.2+ 的 Container Manager 图形界面无法满足 MySQL 8.0 启动的最小依赖,硬靠点选“运行”大概率秒退。根本原因不是镜像问题,而是它不暴露认证插件、字符集、健康检查等关键配置入口。你必须手动补全以下 4 个 MYSQL_* 环境变量:
-
MYSQL_ROOT_PASSWORD:必须是非空字符串,且不能含$、@、#等 shell 特殊符号——DSM 界面会截断或转义,日志只报Initialization of mysqld failed -
MYSQL_INITDB_SKIP_TZINFO=1:跳过时区初始化,避免因宿主机缺失/usr/share/zoneinfo导致失败 -
MYSQL_ALLOW_EMPTY_PASSWORD=no:显式关闭空密码 fallback,防止某些镜像版本降级到不安全模式 -
MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=caching_sha2_password:MySQL 8.0.4+ 必须显式声明,否则初始化阶段认证插件不匹配,进程直接退出
端口映射必须手动填 3306:3306,禁用“自动”
Container Manager 默认启用自动端口映射,MySQL 容器常被分到 32768–32775 这类高位端口。Navicat、DBeaver、Java 应用默认连 :3306,根本找不到服务,连错端口只会看到“Connection refused”。
- 在「网络端口」设置里,把「本地端口」从「自动」改成手动填
3306,容器端口保持3306 - 如果 NAS 所在局域网已有设备占了
3306(比如另一台树莓派或旧版 MySQL),那就填3307,客户端连接 URL 也得同步改成:3307 - 别信“自动检测冲突”——界面不展示
[ERROR] [MY-010262] Bind on TCP/IP port: Address already in use,只显示“已停止”,你得自己查netstat -tuln | grep :330
挂载路径必须是 /var/lib/mysql,其他路径全无效
MySQL 8.0 镜像硬编码了数据目录路径,挂载成 /data 或 /mysql 都不会生效。不挂对,等于没装数据库——删容器 = 丢库。
- 宿主机路径(如
/volume1/docker/mysql8/data)必须映射到容器内/var/lib/mysql - 挂载前需提前创建目录并赋权:
mkdir -p /volume1/docker/mysql8/data && chown -R 999:999 /volume1/docker/mysql8/data(MySQL 容器默认以 UID 999 运行) - Container Manager 不校验挂载权限,即使你
chmod 777,UID/GID 不匹配仍会导致Permission denied写入失败
中文乱码和远程访问必须靠自定义配置文件
Container Manager 不支持传入 --character-set-server=utf8mb4 这类命令行参数,所以仅靠环境变量无法解决中文乱码和远程访问问题。你必须额外挂载一个 custom.cnf 文件。
- 在 NAS 上创建
/volume1/docker/mysql8/conf/custom.cnf,内容为:
[mysqld] default_authentication_plugin = caching_sha2_password character_set_server = utf8mb4 collation_server = utf8mb4_unicode_ci bind-address = 0.0.0.0
/etc/mysql/conf.d/custom.cnf(注意是 .cnf 后缀,MySQL 会自动加载 conf.d 下所有 .cnf 文件)CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'your_password'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
最易被忽略的是挂载权限与 UID/GID 匹配——哪怕路径、端口、环境变量全对,chown 漏掉一步,容器就卡在 “Starting MySQL database server” 不动,日志里没有任何错误提示,只有 mysqld 进程静默退出。











