You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Google Cloud COS实例上实现容器每日自动重启?

如何在Google Cloud COS实例上实现容器每日自动重启?

嘿,这个问题我之前管理COS实例时也踩过坑——普通cron确实在实例重建后就没了,折腾好一阵才摸索出几个靠谱的办法,分享给你:

推荐方案1:用Cloud Scheduler远程触发(最省心,多实例也适用)

既然用的是Google Cloud的服务,完全可以脱离VM本身来管理定时任务,这样不管实例怎么重建,任务都能正常跑。

步骤超简单:

  1. 先确保你有个带compute.instanceAdmin权限的服务账号,Cloud Scheduler需要它来访问你的VM。
  2. 去Cloud Console创建Cloud Scheduler任务:
    • 频率设成你要的时间,比如0 2 * * *(每天凌晨2点,时间格式和cron一致)
    • 任务类型选「gcloud CLI」,执行下面的命令(替换成你的实例和容器信息):
      gcloud compute ssh <你的实例名> --zone <实例所在区域> --command "docker restart <你的容器名>"
      
    这样每天到点就会远程登录VM执行重启命令,完全不用在VM上改任何配置,实例重建也丝毫不影响。

方案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持久化。

  1. 在实例模板的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
  1. 部署后,你可以用systemctl list-timers查看定时任务状态,用journalctl -u restart-container.service看执行日志,比cron更直观。

为啥不推荐普通cron?

你担心的完全没错——普通crontab -e加的任务,在COS实例重建后会彻底丢失,因为COS的根文件系统是会被重置的。除非把cron配置挂到持久化磁盘上,但还要额外配置磁盘挂载,反而麻烦,不如上面的方案省心。

备注:内容来源于stack exchange,提问作者Bender Rodriguez

火山引擎 最新活动