1. 问题描述
docker容器重启策略restart设置了unless-stopped,并且在没有执行手动停止容器情况下,进行系统更新或重启,那么这些容器不会自启动。always的容器会正常自启动。
2. 临时解决方案
论坛中有用户分享了一个该问题的临时解决方案
简单来说,就是对 docker.service 文件进行修改,注释掉服务关闭时执行的强制关闭所有容器指令
问题:每次升级版本后都得重新来一遍,因为更新后docker.service都会被覆盖回默认状态
3. 基于drop-in机制的解决方案
通过学习临时解决方案可以发现,飞牛对 docker.service 文件进行了修改,导致重启策略为 unless-stopped 的容器不能自启动。那么我们也可以对服务配置文件进行修改,Unit 文件有一个 drop-in 覆盖机制,允许在不修改主配置文件的情况下添加或覆盖特定设置。
3.1 解决思路
增加ExecStartPost行
3.2 具体操作
- 开启ssh服务,并通过ssh登录设备,参考博客
- 编辑docker服务,生成覆盖配置
sudo systemctl edit docker.service
- 粘贴相关指令代码。仅需复制粘贴从
[Service] 开始的两行。上下相关的注释部分也贴在了下面,便于定位指令粘贴位置。
### Editing /etc/systemd/system/docker.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file
[Service]
ExecStartPost=/bin/sh -c 'sleep 5; for c in $(docker ps -aq); do [ "$(docker inspect --format="{{.HostConfig.RestartPolicy.Name}}" "$c")" = "unless-stopped" ] && [ "$(docker inspect --format="{{.State.ExitCode}}" "$c")" != "0" ] && docker start "$c"; done'
### Lines below this comment will be discarded
### /etc/systemd/system/docker.service
# [Unit]
重启策略为unless-stopped且exit code不为0的机器。0表示为正常退出。
- 保存退出后检查覆盖配置,应该只有2行内容
cat /etc/systemd/system/docker.service.d/override.conf
- 重新加载服务配置文件
sudo systemctl daemon-reload
- 重启docker服务
sudo systemctl restart docker
- 检查容器是否如期启动
docker ps
4. 最后
在利用了drop-in机制的配置下,即使更新了飞牛系统,也不会影响我们对 docker.service 的修改
恳请大家批评指正!积极讨论,共同进步。