👾
Dockerだって、管理しているコンテナを死活管理したい!
やりたいこと
コンテナの死活を監視して、discordなどのWebHookで通知を出したい。
死活だけ知りたいのと、これに関することはできるだけメモリを使いたくないので、できるだけshだけで完結させたい。
やったこと
docker-compose.ymlの基礎設定
services:
api-sever:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8000
volumes:
- ./api-src:/usr/src/app:ro
healthcheck:
test: [ "CMD-SHELL", "curl -f -s http://localhost:8000 || exit 1" ]
start_period: "30s" # 開始時の間隔
retries: 3 # リトライ回数
timeout: "5s" # タイムアウトの長さ
interval: "60s" # ヘルスチェックの間隔
この時、ホスト側には、8080ポートが開いていますが、healthcheckのtestのコマンドが叩かれるのは、コンテナ内側です。なので、8080ポートではなく8000ポートを指定することになります。
(※ これについて書かれた資料がなく、ずっと詰まっていました)
死活監視shスクリプト
surveillance.sh
#!/bin/sh
WEBHOOK_URL="https://******/api/webhooks/****"
NAMES=$(docker ps --format "{{.Names}}" | awk '{print $NF}')
for line in ${NAMES}
do
STATUS=$(docker ps --filter "name=$line" --format "{{.Status}}" | awk '{print $NF}')
if echo "$STATUS" | grep -q "(unhealthy)"; then
TEXT="{\"content\":\"down = $line\"}"
curl -X POST -H "Content-Type: application/json" -d "$TEXT" "$WEBHOOK_URL"
echo "$TEXT" >> ./log/surveillance.log
fi
done
dockerのhealthcheckでエラーが検知されると、docker ps
でステータスがunhealthy
となります。
これを利用して、死活監視をします。
死活監視shスクリプトをcronに登録
surveillance_path=`pwd ./surveillance.sh `
chmod +x $surveillance_path
job="*/1 * * * * $surveillance_path/surveillance.sh $WEBHOOK_URL"
(crontab -l; echo "$job") | crontab -
上記のような感じで、適当に、shに実行権限与えてcronに登録すればオッケー!
なお、この書き方だと、1分に1回の頻度で死活監視shスクリプトが動きます。
オワリ
以上!オワリです!簡単だったね!
(※ portで詰まりまくって2時間潰したのは、ナイショ。)
Discussion