docker-compose服务配置为no/unless-stopped却开机自启的原因咨询
问题解释与排查方向
核心逻辑先明确
Docker的restart策略是容器级别的,和docker-compose的停止命令行为直接绑定:
restart: no:容器绝不会自动重启,无论任何场景restart: unless-stopped:容器意外退出(比如崩溃、宿主机强制断电)时会自动重启;宿主机重启后,容器会自动启动,除非你之前用docker stop或docker-compose stop手动停止过它
第一台笔记本:近期突然开机启动特定容器
可能的原因有这几个:
- 容器上次是非正常停止:你以为关机前优雅停止了,但可能该容器在关机前已经崩溃退出(比如代码报错、资源耗尽),或者宿主机是强制关机/意外断电,不是正常的优雅关机。这种情况下Docker会判定容器属于“意外退出”,触发
unless-stopped的重启规则,开机后自动启动。 - 重启策略被修改:可能误操作通过
docker update <容器名> --restart unless-stopped(甚至always)改了该容器的策略,哪怕docker-compose.yml里写的是no,容器实际生效的是最后修改的策略。可以用命令验证:docker inspect <容器名> --format '{{.HostConfig.RestartPolicy.Name}}' - 被系统服务接管:有人在这台机器上创建了systemd(或其他 init 系统)的服务文件,设置开机自动启动这个
docker-compose配置,绕过了docker-compose本身的重启策略。可以查systemd服务:systemctl list-unit-files | grep docker
第二台设备:一年来开机自动启动10个容器
大概率是这两个原因:
unless-stopped策略触发:这些容器的restart配置是unless-stopped,而且你每次关机前的“优雅停止”没真正停止它们——比如你用的是docker-compose pause而不是docker-compose stop,或者关机前容器已经意外退出了。宿主机重启后,Docker会按照规则自动启动这些没被手动停止的容器。- 关机操作不彻底:如果关机前只关闭了终端窗口,但没执行
docker-compose stop/docker stop,容器其实还在后台运行,宿主机重启后Docker会自动恢复这些运行状态的容器。
验证方法
- 查单个容器的实际重启策略:
docker inspect <容器ID/名称> --format '{{.HostConfig.RestartPolicy.Name}}' - 看容器停止状态:
docker inspect <容器ID/名称> --format '{{.State.Status}} 退出码:{{.State.ExitCode}} 停止时间:{{.State.FinishedAt}}',如果退出码非0,说明是意外崩溃;如果停止时间远早于关机时间,说明容器早挂了没被手动停止。 - 检查系统自启服务:比如systemd下有没有自定义的
docker-compose启动服务,避免被外部服务触发启动。
内容的提问来源于stack exchange,提问作者Dustin Oprea
相关产品推荐
相关产品推荐

