Dockerコンテナでpythonを動かしてSlack Webhookを使ってみた
背景
会社の分析チーム内で、GKEやDockerコンテナだのを使う話が出てきました。
しかし、Dockerとか全く触ったことがないので、その勉強と練習を兼ねてやってみたという記事です。
PythonとSlack APIは普段から触ってるので、材料としてちょうど良さそうだったからです。
Dockerコンテナとは
Dockerfile に記載した内容で Docker image が作成される。
Docker image がレジストリに置かれて、クラウドなどの実行環境(マシン)に pull される。
Docker image をビルドすると Dockerコンテナができあがる。
つまり、Dockerfile とは、Dockerコンテナの設計書のようなものである。
図解するとこんな感じでしょうか。
Dockerfileで使われるコマンド
- FROM: docker image の指定
- ENTRYPOINT: コマンドを書く。
- CMD も同様らしい。ENTRYPOINT は docker run 時にも上書きできない。CMDは docker run で上書きできるという違いがある
- ENV : 環境変数の設定
- WORKDIR : 作業ディレクトリの指定
- ADD : ファイル、ディレクトリの追加
- COPY : ローカルなどのソースからコンテナ内にファイルを送信できる。
- ADDと似ているがCOPYの方が役割が自明なのでCOPYの方が望ましいとされている。
実際にPythonスクリプトを実行するimageを作ってコンテナで実行してみる
準備
プロジェクト作成
以下のようなファイル構成のプロジェクトを作成。
myProject ├ Dockerfile └ src ├ requirements.txt └ sample.py
コマンドはこちら
mkdir myProject cd myProject touch Dockerfile mkdir src cd src touch requirements.txt touch sample.py
PythonのDocker imageをpull
docker pull python:3.6
実行するPythonファイルを作成
src/sample.py
内に以下を書きます。
# -*- coding: utf-8 -*- import slackweb slack_webhook_url = 'YOUR_SLACK_WEBHOOK_URL' def main(): slack = slackweb.Slack(url=slack_webhook_url) slack.notify(text='dockerコンテナで実行してみるよ', channel='#SLACK_CHANNEL') if __name__ == '__main__': main()
必要なライブラリをrequirements.txtに記載
src/requirements.txt
内に以下を書きます。
slackweb
Dockerfile作成
Dockerfile
内に以下を書きます。
FROM python:3.6 # ソースコードを格納する RUN mkdir src COPY src src/ # ライブラリのインストール RUN pip install -r ./src/requirements.txt # Pythonを実行する WORKDIR ./src/ ENTRYPOINT ["python", "sample.py"]
Docker image 作成
以下を Dockerfile のあるディレクトリで実行。
docker build -t myproject:1.0 .
Dockerコンテナをビルドしてスクリプトの実行
docker run -d -P myproject:1.0
- -d : コンテナをバックグラウンドで実行し、コンテナ ID を表示
- -P :全ての露出ポートをランダムならポートに公開
実行結果
以下のような感じで任意のチャンネル内で動作してくれました。
APIを使ったようなPythonスクリプトも無事動作してくれたので、色々やりたいことができそうな感じです。
今後はGKEとかでデータ分析スクリプトを動かしたり機械学習APIとか作ったりしてみたいです。