exited (1) 表示 mysql 主进程 mysqld 启动前即失败,未进入初始化阶段;常见原因包括环境变量缺失(如 mysql_root_password 未设置)、配置文件语法错误或路径不合法、挂载目录权限不足、端口冲突或磁盘空间不足,此时 docker logs 通常为空或极短。

Exited (1) 表示 MySQL 进程启动失败,不是运行中崩溃
退出码 1 说明容器内 MySQL 主进程(mysqld)根本没成功拉起来,就因配置、权限或依赖问题立刻退出了。它和 137(OOM)、143(被 stop)有本质区别:这里不是“活过再死”,而是“压根没活”。日志往往极短甚至为空,因为进程连初始化阶段都没走完。
验证方法很简单:docker ps -a 看到状态是 Exited (1),接着立刻执行:docker logs --tail 100 。如果输出只有几行、或干脆空,基本可以断定是启动前卡点。
- 常见现象:容器刚创建,STATUS 就变成
Exited (1),docker logs里只看到类似error: database is uninitialized and password option is not specified或Can't start server: Bind on TCP/IP port. Got error: 98: Address already in use - 关键判断:只要日志里没出现
mysqld: ready for connections或MySQL init process done. Ready for start up.,就说明还没走到真正服务监听阶段 - 不要跳过
--it临时调试:用docker run -it --rm -e MYSQL_ROOT_PASSWORD=123 mysql:8.0直接跑一次,能立刻看到终端报错,比看日志更直观
检查环境变量和必需的启动参数是否缺失
MySQL 官方镜像对初始化高度敏感,少一个关键变量就会直接退出 1。尤其注意 MYSQL_ROOT_PASSWORD 和 MYSQL_ALLOW_EMPTY_PASSWORD 是互斥开关,不能同时不设 —— 否则镜像会拒绝启动。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
-
MYSQL_ROOT_PASSWORD必须显式设置,或设MYSQL_ALLOW_EMPTY_PASSWORD=yes(仅测试环境),否则报错退出 - 若用了
MYSQL_DATABASE,它只在首次初始化时生效;但若挂载卷已有数据,这个变量会被忽略,不会导致退出,所以不是主因 - 自定义配置文件(如
my.cnf)路径必须正确:挂载到/etc/mysql/conf.d/下,且后缀为.cnf;放错位置或语法错误(比如多了一个逗号)会导致mysqld启动参数校验失败,直接退1 - 避免混用
command和环境变量:例如在docker-compose.yml中写了command: ["mysqld", "--skip-grant-tables"],又没配MYSQL_ROOT_PASSWORD,镜像的初始化逻辑会被绕过,极易出错
验证挂载路径权限与宿主机目录是否存在
挂载失效是 Exited (1) 的高频原因,尤其在 NAS、rootless Docker 或 SELinux 环境下。MySQL 进程以 mysql 用户运行,但宿主机目录若属 root 且无写权限,它连 /var/lib/mysql 都创建不了,秒退。
- 先确认宿主机路径存在:
ls -ld /data/mysql;若提示No such file or directory,容器启动时会因挂载点不可达而失败 - 检查权限:
ls -ld /data/mysql输出应包含drwxr-xr-x且属主可写;若显示drwx------ 1 root root,MySQL 进程无法写入,必退1 - SELinux 用户需加
:z或:Z标签:-v /data/mysql:/var/lib/mysql:z,否则安全策略拦截写操作 - NAS 用户特别注意:部分 NAS 的 Docker UI 会自动把路径转成相对路径或加入额外前缀,务必进 CLI 用
docker inspect查Mounts.Source字段,确认是绝对路径(如/volume1/docker/mysql)而非./mysql
端口冲突和磁盘空间不足也会触发 Exit 1
这两类问题常被忽略,但确实会导致 MySQL 启动流程在 bind 或初始化阶段失败并返回通用错误码 1。
- 端口被占:宿主机
3306已被其他进程(包括另一个 MySQL 容器)占用,mysqld无法绑定,日志通常含Address already in use;查法:lsof -i :3306或netstat -tuln | grep :3306 - 磁盘满:MySQL 初始化需要临时空间写 ibdata1、日志等;
df -h看挂载点所在分区,若Use%达 95%+,很可能因write failed导致退出;注意不是容器内存,是宿主机磁盘 - inode 耗尽:小文件过多时
df -i可能显示Use%100%,也会让 MySQL 创建文件失败;这种场景下docker logs可能只显示模糊的Cannot create/write to file - 别信“健康检查”:如果容器已配置
healthcheck,但 MySQL 根本没起来,healthcheck不会触发——它只在容器 Running 后才开始探测
真正棘手的是那些没有明确报错信息的 Exited (1):日志空、路径权限看着没问题、端口也没占。这时候得回到最原始的办法——删掉容器,用 docker run -it 加最小参数重试,一边减参数一边观察,直到找出那个“多出来”的配置项。很多问题就藏在你以为“应该没问题”的那一行 volumes 或 environment 里。










