👾

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