現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

Dockerコンテナでpythonを動かしてSlack Webhookを使ってみた

背景

会社の分析チーム内で、GKEやDockerコンテナだのを使う話が出てきました。
しかし、Dockerとか全く触ったことがないので、その勉強と練習を兼ねてやってみたという記事です。
PythonとSlack APIは普段から触ってるので、材料としてちょうど良さそうだったからです。

Dockerコンテナとは

Dockerfile に記載した内容で Docker image が作成される。
Docker image がレジストリに置かれて、クラウドなどの実行環境(マシン)に pull される。
Docker image をビルドすると Dockerコンテナができあがる。
つまり、Dockerfile とは、Dockerコンテナの設計書のようなものである。
図解するとこんな感じでしょうか。

f:id:kazuki_hykw:20181121163118p:plain

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スクリプトも無事動作してくれたので、色々やりたいことができそうな感じです。

f:id:kazuki_hykw:20181121164323p:plain

今後はGKEとかでデータ分析スクリプトを動かしたり機械学習APIとか作ったりしてみたいです。

参考資料