如何在Google Cloud COS实例上实现容器每日自动重启?
如何在Google Cloud COS实例上实现容器每日自动重启?
嘿,这个问题我之前管理COS实例时也踩过坑——普通cron确实在实例重建后就没了,折腾好一阵才摸索出几个靠谱的办法,分享给你:
推荐方案1:用Cloud Scheduler远程触发(最省心,多实例也适用)
既然用的是Google Cloud的服务,完全可以脱离VM本身来管理定时任务,这样不管实例怎么重建,任务都能正常跑。
步骤超简单:
- 先确保你有个带
compute.instanceAdmin权限的服务账号,Cloud Scheduler需要它来访问你的VM。 - 去Cloud Console创建Cloud Scheduler任务:
- 频率设成你要的时间,比如
0 2 * * *(每天凌晨2点,时间格式和cron一致) - 任务类型选「gcloud CLI」,执行下面的命令(替换成你的实例和容器信息):
gcloud compute ssh <你的实例名> --zone <实例所在区域> --command "docker restart <你的容器名>"
- 频率设成你要的时间,比如
方案2:用COS的cloud-config持久化定时脚本(单实例首选,配置极简)
COS本身支持通过cloud-config来写入初始化配置,每次实例重建(redeploy)时,系统都会自动帮你把配置恢复好,不会丢。
具体操作:
创建COS实例(或修改实例模板)时,添加以下cloud-config内容:
write_files: # 把重启脚本放到cron.daily目录,系统每天会自动执行 - path: /etc/cron.daily/restart-my-container permissions: 0755 content: | #!/bin/bash # 先检查容器是否存在,避免报错 if docker inspect <你的容器名> &>/dev/null; then docker restart <你的容器名> echo "$(date): 容器已重启" >> /var/log/container-restart.log fi
系统默认会在每天凌晨3点左右执行cron.daily里的脚本,你要是想改时间,去调整/etc/crontab里的配置就行(同样可以通过cloud-config写入)。
方案3:用systemd Timer(定时更灵活,管理更规范)
如果需要精准控制重启时间(比如每天凌晨1点45分),或者想用systemd的方式管理任务状态,这个方案更合适,同样能通过cloud-config持久化。
- 在实例模板的cloud-config里添加systemd服务和timer配置:
write_files: # 定义重启容器的systemd服务 - path: /etc/systemd/system/restart-container.service permissions: 0644 content: | [Unit] Description=每日重启业务容器 [Service] Type=oneshot ExecStart=/usr/bin/docker restart <你的容器名> # 把日志写到指定文件,方便排查 StandardOutput=append:/var/log/container-restart.log StandardError=append:/var/log/container-restart.log # 定义定时触发的timer单元 - path: /etc/systemd/system/restart-container.timer permissions: 0644 content: | [Unit] Description=定时触发容器重启的Timer [Timer] # 每天凌晨1点45分执行,时间规则参考systemd.time OnCalendar=*-*-* 01:45:00 # 如果实例在触发时间没运行,下次启动时自动补执行 Persistent=true [Install] WantedBy=timers.target # 实例启动时自动启用timer runcmd: - systemctl daemon-reload - systemctl enable --now restart-container.timer
- 部署后,你可以用
systemctl list-timers查看定时任务状态,用journalctl -u restart-container.service看执行日志,比cron更直观。
为啥不推荐普通cron?
你担心的完全没错——普通crontab -e加的任务,在COS实例重建后会彻底丢失,因为COS的根文件系统是会被重置的。除非把cron配置挂到持久化磁盘上,但还要额外配置磁盘挂载,反而麻烦,不如上面的方案省心。
备注:内容来源于stack exchange,提问作者Bender Rodriguez




