mysql_root_password必须设置,否则mysql 8.0+容器因数据库未初始化且无密码选项而直接退出;它与挂载数据卷无关,是镜像强制校验的硬性入口条件。

MYSQL_ROOT_PASSWORD 必须设置,否则容器启动失败——这是最常卡住的地方。
为什么 MYSQL_ROOT_PASSWORD 不能省略?
MySQL 8.0+ 官方镜像在首次启动时会检查该变量:没设就直接退出,并打印错误 error: database is uninitialized and password option is not specified。哪怕你挂载了已有数据卷,只要容器是第一次初始化,这个校验仍会触发。
- 它不是“建议设置”,而是硬性入口守门员
-
MYSQL_ALLOW_EMPTY_PASSWORD=yes可绕过,但仅限开发环境,生产禁用 -
MYSQL_RANDOM_ROOT_PASSWORD=yes会把生成的密码打到日志里,适合 CI/CD 场景
MYSQL_USER 和 MYSQL_PASSWORD 怎么配才生效?
这两个变量必须成对出现,且只有在 MYSQL_DATABASE 同时存在时才会自动建库、授权并创建用户。单独设 MYSQL_USER 不会创建用户,也不会报错——只是静默忽略。
- 授权范围固定为:
GRANT ALL ON `数据库名`.* TO '用户名'@'%' - 如果
MYSQL_DATABASE没设,MYSQL_USER和MYSQL_PASSWORD就完全无效 - 用户权限不可定制(比如不能只给
SELECT),如需细粒度控制,得用初始化脚本
哪些环境变量会影响连接兼容性?
老客户端(比如 MySQL 5.x 客户端、某些 JDBC 驱动)连不上 MySQL 8.0 默认的 caching_sha2_password 认证插件,这时要靠环境变量干预。
- 加
MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password强制降级认证方式 - 若遇到连接超时,大概率是 DNS 反查卡住,加
--skip-name-resolve到command参数里(不是环境变量) -
MYSQL_ONETIME_PASSWORD=yes会让 root 首次登录后强制改密,适合安全审计场景
环境变量看着简单,但 MYSQL_ROOT_PASSWORD 的缺失、MYSQL_USER 的依赖条件、以及认证插件不匹配这三点,是实际部署中最容易反复踩坑的位置。











