深夜にdocker-compose up -d
してるとデスクトップに「GO TO BED」と通知が来るようにしてみました。
cronを稼働させるためのコンテナを用意し、自動的にcurlコマンドでのslack投稿を行うようにすることで実装しています。お試しで作ったので実用性は低いです。
cronとは
指定したコマンドやシェルスクリプト等を日時指定で自動実行するための常駐プログラム(デーモンプロセス)。
内部では、1分毎に起動、/etc/crontab などに置かれているcrontabファイルを調査、該当する時刻の場合処理を実行、という処理が行われているようです。
crontabファイルの置き場所やデーモンとして起動するか否かなど、細かい違いがあるようですが今回そこまでは調べてません。
設計
docker-compose.ymlにcron稼働用のコンテナを追加し cron -f
コマンドでcronタスクを常駐させるだけです。
slack側でWebhookの設定
slack側で Incoming Webhook を設定して、HTTPリクエストでslack投稿できるようにします。
なお、 Incoming Webhook は認証がないのでURLが漏れると悪意のあるユーザーからも投稿できるようになってしまいます。
実際の手順については、以下を参考にさせていただきました。
参考:SlackのWebhook URL取得手順
URLを取得したらcurlコマンドで投稿できるか確認してみましょう。
curl -X POST --data-urlencode "payload={\"channel\": \"#general\", \"username\": \"testuser\", \"text\": \"Hello\"}" https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
実装
深夜0時から6時まで、5分毎に「GO TO BED」と投稿されるようにしてみました。
.
├ cron_alert/
│ └ Dockerfile
│ └ midnight_alert.sh
└ docker-compose.yml
cron:
build: ./cron_alert
volumes:
- ./cron_alert:/cron_dir
ports:
- "3456:3456"
FROM ubuntu:latest
# TimeZone設定
ENV TZ Asia/Tokyo
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y cron sudo curl vim tzdata
RUN echo '*/5 0-6 * * * root /cron_dir/midnight_alert.sh' >> /etc/crontab
CMD ["cron", "-f"]
#!/bin/sh
CHANNEL="#general"
USERNAME="webhookbot"
TEXT="GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED GO TO BED"
PAYLOAD="payload={\"channel\": \"$CHANNEL\", \"username\": \"$USERNAME\", \"text\": \"$TEXT\"}"
curl -X POST --data-urlencode "${PAYLOAD}" https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
参考:Docker コンテナ内でタスクを cron 起動する
参考:Dockerコンテナのタイムゾーン変更方法
最後に
深夜にdocker-compose up -d
してるとデスクトップに通知が来るのを確認して満足しました。
変なこと書いてたら指摘してくださるとうれしいです。