线上服务器环境,基于 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 ps
查看。例如:
$ 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 聊聊, 查看更多联系方式