IT業務効率化

digdagで実行するPythonをDocker環境でバージョン管理する

digdag docker python

前回の記事がこちらなので、ぜひ合わせてご覧ください。

digdag mac python
ワークフローエンジンdigdagをmacにインストールするdigdagとは digdagはTreasure Dataが開発したオープンソースのワークフローエンジンです。cronと似ていて、定期...

digdagで実行される全てのpythonの環境を統一したい

今回の目標はこれです!

digdagはprojectという区切りで別れています。これら全てに対して環境を統一することが今回の目的です。

.
├── conf
│   └── python_config.conf -- ★これを全てのprojectに適用させたい
├── project1
│   ├── workflow1_1.dig
│   └── workflow1_2.dig
├── project2
│   └── workflow2_1.dig
├── project3
│   ├── workflow3_1.dig
│   ├── workflow3_2.dig
│   ├── workflow3_3.dig
│   └── workflow3_4.dig
└── project4
    └── workflow4_1.dig

digdagによるDocker起動とPython実行

ディレクトリ構成のイメージ

(py36) yuki-PC:digdag-server yuki$ tree -I __pycache__
.
├── conf
│   ├── Dockerfile
│   └── requirements.txt
└── python-test
    ├── bin
    │   └── tasks.py
    └── python_docker.dig

python-testはprojectのひとつです。digdagのprojectは、これと同列に並んでいきます。

それとは別にconfファイルを用意し、この中にPythonの環境を設定します。

DockerFileを記述する

Dockerfileは必要最低限の構成でまず試してみます。

FROM python:3.6
  
RUN apt-get -y update&&apt-get -y upgrade
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

ENV APP_ROOT /usr/src
WORKDIR $APP_ROOT

ADD requirements.txt $APP_ROOT

RUN pip install -r requirements.txt
  1. ベースとなるdockerイメージはpython3.6です
  2. OSのアップデートをします
  3. pipのアップデートをします
  4. setuptoolsのアップデートをします
  5. /usr/srcを環境変数APP_ROOTとします
  6. $APP_ROOTに移動します
  7. ローカルのrequirements.txtを、dockerの$APP_ROOTに配置します
  8. docker内でrequirements.xtxの内容をpip install で読み込みます

あとはdocker build . -t digdag_pythonでdigdag_pythonというイメージを作成します。

yuki-PC:conf yuki$ docker build . -t digdag_python
Sending build context to Docker daemon  3.072kB
Step 1/8 : FROM python:3.6
3.6: Pulling from library/python
4ae16bd47783: Pull complete 
<中略>
Successfully built 2de1672f353b
Successfully tagged digdag_python:latest
yuki-PC:conf yuki$ 
yuki-PC:conf yuki$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
digdag_python       latest              2de1672f353b        12 minutes ago      1.14GB

digdagからdockerを呼び出す

digdagでdocker環境を呼び出すには以下のように記述します。

_export:
  docker:
    image: digdag_python

+step1:
  py>: bin.tasks.python_test

imageには、先ほどdocker buildコマンドで作成したdigdag_pythonを指定します。

python_testは関数で、中はこのようになっています。(詳細は前回の記事にて)

def python_test():
    print("hello digdag")

この関数をdocker上で呼び出す形で実行してみました。

yuki-PC:python-test yuki$ digdag run -a python_docker.dig 
<中略>
2019-09-08 14:58:09 +0900 [INFO] (0017@[0:default]+python_docker+step1): py>: bin.tasks.python_test
hello digdag
Success. Task state is saved at /usr/local/digdag-server/python-test/.digdag/status/20190907T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
yuki-PC:python-test yuki$ 

hello digdagがprintされているので成功しました。

requirements.txtの検証

Dockerfile上で実行しているので、実行環境は統一することができました。

念の為requirements.txtの通りライブラリがインストールされているかも確認します。requirements.txtは以下のようになっています。

python-test yuki$ cat ../conf/requirements.txt 
numpy==1.14.3
pandas==0.23.0

pythonの関数は以下のように書き換えました。

def python_test():
    print("hello digdag")
    print(np.__version__)
    print(pd.__version__)

実行結果は以下のようになりました。

hello digdag
1.14.3
0.23.0

requirements.txtに記載した内容が無事反映されていたので、ライブラリのバージョン管理もできるようになりました。

※requirements.txtの内容を書き換えて動作確認もできました。

仕組みについてより詳しく

こちらの記事にどのような仕組みでdockerに接続するか書かれていました。私の環境でもdigdag実行時に-l debugの引数をつけることで確認できるそうです。このようになりました。

docker run -i --rm -v /usr/local/digdag-server/python-test:/usr/local/digdag-server/python-test:rw -w /usr/local/digdag-server/python-test digdag_python

dockerのプロジェクパスと同じディレクトリを、ローカルの同じプロジェクトパスでマウントし、WORKIDR(ワーキングディレクトリ)を移動してdockerイメージを利用している。

記事にもあるが、serverモードの時には、このままだとデータが消失してしまうため注意が必要である。

おわりに

あとはdockerイメージを変更があるたびに構築することが面倒なので、その辺りをどうにかできないか考えております。

docker-composeあたりを勉強することになると思うので、次回また更新します。

お読みいただきどうもありがとうございました。

 

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki