系统重启时 docker 容器没有自启动问题排查

更新日期: 2024-02-08 阅读次数: 448 字数: 404 分类: docker

线上服务器环境,基于 docker 部署了一堆服务,虽然在 docker-compose.yml 中将各个服务配置了

restart: always

但是,实际测试发现,系统重启后,所有后期配置的 restart: always 的服务,都没有自启动。

只有一开始就设置了 restart: always 的服务,才自启动成功。

Google 搜索了一下,发现确实存在这个问题,对于这种容器,需要后期手动通过 docker 命令来更新配置,只修改 docker-compose.yml 是不够的。

检查指定容器当前配置的方法

docker inspect <your-container> | fgrep -i restart -A 5

your-container 部分可以使用 CONTAINER ID 或者 NAME。

可以通过

docker container ls

查看。例如:

$ docker inspect f9df5e40eea8 | fgrep -i restart -A 5
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2332778,
            "ExitCode": 0,
            "Error": "",
--
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
--
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",

可以看到,这里的 RestartPolicy Name 为空字符串,即,代表默认值 no,不会自启动。

而自启动正常的 mysql 容器对应的配置则是:

 "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
},

redis 容器对应的配置则是

"RestartPolicy": {
                "Name": "on-failure",
                "MaximumRetryCount": 0
},

对于后续重新 build 的容器,也是正常的。

启用

docker update <your-container> --restart always

禁用

docker update <your-container> --restart no

always 与 on-failure 的区别

  • always 总是重启容器,无论退出码是什么。
  • on-failure 仅在容器以非零退出码退出时才重启容器。

参考

  • https://stackoverflow.com/questions/64644587/containers-not-restarted-after-update-with-restart-always-in-docker-compose-yml

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式