GCE 使用 Container-Optimized OS (COS) 增加 crontab 服務,定時執行任務

前言

Container-Optimized OS (下稱COS) 是 Google 推出的容器服務
專門給 Google Compute Engine(GCE) 使用
可以很快速、輕量的直接使用特定服務,如 MySQL, PostgreSQL, nginx, redis …等

由於是 Google 高度客制的 OS,所以少了許多 Linux 原生該有的指令
為了確保其穩定性,連 apt-get 都移除了!所以無法額外安裝套件

對於 debug 或一些查問題的指令,Google 提供 toolbox 可以安裝套件來使用
toolbox apt-get crontab
安裝好後,要執行也是得透過 toolbox,如toolbox crontab -l
會透過 container 封裝執行

一般查問題的指令還不影響,但像crontab這種排程作業,就會無法運作!

像這種情況,Google 提供的作法是透過 docker container 自行封裝所需功能後
由 docker 啟動、使用!

作法

COS可以直接使用 dockerHub 上的 image
可以先去搜尋看看想要的功能是否已經有現成的,可以省下自行封裝的時間!

crontab為例,就在 dockerHub 找到帶 UI 的 crontab
crontab-ui

連自己下指令都免了
啟動後,透過 WEB UI 設定就行!

零、使用crontab-ui注意事項

在 GCE 上使用要注意的是,他的時區是UTC +00:00
所以在設定時,要扣掉 8 小時,才會是台灣的執行時間
如:
凌晨0:00執行,就要設定 16:00。在cron上即0 16 * * *
凌晨1點半執行,就是設定 17:30。在cron上即30 17 * * *

一、到 GCE 管理頁面,透過 SSH 連入

至 GCE 管理頁面,點擊 SSH,透過 WEB UI 連線進去

二、建立外部目錄供 container 保存資料

由於 COS 對於目錄有一些權限限制
為避免受這些限制影響,或自己對 Linux 權限操作不算熟悉的話
建議就直接在user目錄放置檔案,最簡單無腦
/home/{您的username}/crontab-ui

SSH WEB UI 連線進去時,預設就是在/home/{您的username}/底下
故直接輸入mkdir crontab-ui建立目錄

三、執行指令

docker run --mount type=bind,source=/home/{您的username}/crontab-ui/,target=/crontab-ui/crontabs/ -d --restart always -e BASIC_AUTH_USER=帳號 -e BASIC_AUTH_PWD=密碼 -p 80:8000 alseambusher/crontab-ui

參數解析

根據 docker 官方文件
可以加參數自動重新啟動

參數 意思
-d 背景執行
--restart always 自動重啟服務
-p 80:8000 port映射,VM: Container
--mount type=bind,source=/home/{您的username}/crontab-ui/,target=/crontab-ui/crontabs/ 目錄映射,將檔案保存到 VM 上
-e BASIC_AUTH_USER=帳號 -e BASIC_AUTH_PWD=密碼 crontab-ui的自定義參數,使用基本的權限管理功能

若想要走https,crontab-ui 亦有提供參數可掛載憑證!
可以參閱crontab-ui readme獲得更詳細的說明