Dockerコンテナ内からSlack APIを叩いてデスクトップ通知をする

Pythonエンジニア見習いです。現在、私が関わっているプロジェクトでは、ユニットテストの結果をデスクトップに通知するようにしています。しかし、開発環境をDockerに移すことになり、どのようにデスクトップに通知するかが問題となっていました。そこで今回は、コンテナからSlack APIを叩いてSlackのクライアントにデスクトップ通知させる方法を主に紹介していきます。

コンテナからSlack APIを叩く

.zshrc等に環境変数として、APIトークンを登録しておけば以下のように簡単にコンテナにAPIトークンを渡すことが出来ます。

docker run \
  -e SLACK_TOKEN=${SLACK_TOKEN} \
  -e SLACK_USER_NAME=${SLACK_USER_NAME} \
  -v ${PWD}:/src \
  product-test:latest ./watch

SLACK_TOKENがSlackのAPIトークンでSLACK_USER_NAMEがSlackのチーム上でのユーザーネームとなります。

また、コンテナ内で、APIを叩くスクリプトは以下のように書けます。

/bin/bash -eu

curl -sS -XPOST -d 'token=$SLACK_TOKEN' \
  -d 'channel=#test_report' \
  -d 'text=@$SLACK_USER_NAME: $1 tests $2' \
  -d 'as_user=true' \
  https://slack.com/api/chat.postMessage

以上のようにして、コンテナ内からAPIを叩くとSlackクライアントからデスクトップ通知を出すことができます。

それぞれの方法の比較

/tmp/.X11-unixをコンテナにマウントして、表示させる方法

WindowsやiOS等のLinuxではないOSが開発環境の場合、Dockerのコンテナを走らせるためにはVMを経由しなければならないので、そのVMからデスクトップ通知を出す方法を考えなければなりません。また、デスクトップ通知の系統もDocker側のものとは異なるということも考慮しなければならないでしょう。

参考: Running GUI apps with Docker

コンテナ内のファイルの変更をホスト側で検知して表示する方法

ホスト側でも監視プログラムを動作させなければならないことから、複雑になりがちです。更に、開発環境を仮想化によって共有するというDockerによる開発のよさも享受できなくなってしまいます。

今回の方法

コンテナ側に必要なものはcurlとSlackのAPIトークンのみであり、開発環境がなんであれ、ホスト側にSlackのクライアントがあれば動作します。さらに、通知システムはSlackを除けば完全にコンテナ内で閉じているので開発環境を仮想化によって共有するというよさも享受できます。さらに、Slackに通知すれば、ログがたまるので、過去の通知も確認することが出来ます。また、更に通知をチーム内で共有することも出来るので開発メンバーの進捗状況も監視できます。(笑)

結論

Slack APIを叩けば、簡単にコンテナからデスクトップ通知を出すことが出来ます。開発環境をLinuxに限定すれば、1の方法で十分なのですが、その他の環境も考慮すると3の方法がベストです。さらに、開発メンバー同士で互いの進捗を監視できるので、開発がよりエキサイティングなものになるでしょう。