この記事は MicroAd Advent Calendar 2024の18日目の記事です。
はじめに
はじめまして!新卒エンジニアのホンマです。本記事が初投稿になります!新人ゆえ間違いがあるかもしれませんが優しくご指摘いただけると幸いです。
さて、私が所属するバッチ開発チームではワークフローエンジンとしてDigdagを使用しています。配属以降なんとなくで使っていた状態が続いていたためこの機会に色々研究してみようと思います。とはいえ、いきなり全て勉強するのは難しいので今回は環境構築のみやってみようと思います。またDockerを使用するため新しくバッチ開発チームに入った方の学習環境としても利用できるのではという狙いもあります。
この記事のゴール
- Digdagを触れる環境をdockerで作る
- ワークフローを1つ実行する
検証環境
- Macbook Air M1 2020
- Docker Engine v27.3.1
- Docker Compose v2.29.7
リポジトリ
今回作成したリポジトリはこちらです。
使い方
コマンド一つで起動・削除できます。
起動:docker compose up -d
削除:docker compose down
(-vオプションでデータを削除できます)
解説
とりあえずdocker-compose.yml見ていきます。
version: "3"
services:
#digdagサーバー
digdag_server:
container_name: digdag_server
build:
context: .
dockerfile: ./docker/digdag_server/dockerfile
depends_on:
- digdag_postgres
volumes:
- ./docker/digdag_server:/opt/etc/digdag
- /var/run/docker.sock:/var/run/docker.sock
- /tmp:/tmp
command: ["server", "-c", "/opt/etc/digdag/server.properties"]
ports:
- 8080:65432
networks:
- digdag_network
#digdagクライアント(このコンテナでdigdagコマンドを使う)
digdag_client:
container_name: digdag_client
build:
context: .
dockerfile: ./docker/digdag_client/dockerfile
volumes:
- .:/workspace
ports:
- 8081:65432
tty: true
depends_on:
- digdag_server
networks:
- digdag_network
develop:
watch:
- action: sync
path: ./
target: /workspace
#digdagのデータ保存用PostgreSQL
digdag_postgres:
image: postgres:14-alpine
container_name: digdag_postgres
ports:
- 8082:5432
volumes:
- db-store:/var/lib/postgresql/data
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: digdag_db
networks:
- digdag_network
#dozzleサーバー(digdagサーバーのログ確認用)
dozzle_server:
container_name: dozzle_server
image: amir20/dozzle:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 8083:8080
depends_on:
- digdag_server
networks:
- digdag_network
networks:
digdag_network:
driver: bridge
volumes:
db-store:
今回はコンテナを4つ立てています。簡単に説明します。
1. digdagサーバー
今回のメインターゲットのdigdagサーバーです。http://localhost:8080/ でUIが確認できます。
2. digdagクライアント
このコンテナからdigdagサーバに対してリクエストを送ります。
3. PostgreSQL
PostgreSQLは用意しなくてもDigdag自体は動作するのですが、実務では使用することが多いと思うので用意しました。今回は特に触れませんが入っているテーブルを確認してみると面白いです。
(ちなみにPostgeSQLとDigdag接続するのにめちゃくちゃ苦労しました笑)
4. dozzle
こちらも必須ではありませんがログの確認用に設置しました。http://localhost:8083/ で確認できます。Docker DesktopのUIからログを見ても問題ないです。
ワークフロー実行
以下digファイルに書かれたワークフローを実行します。今回はPythonのコードを実行してみようと思います。
timezone: UTC
_export:
docker:
image: "python:3.11.0-alpine"
docker: "/usr/local/bin/docker"
run_options: [ "-m", "1G" ]
pull_always: true
selinux: true
+step1:
py>: src.sample.hello
Pythonのコード
def hello():
print("Hello World!")
PythonのコードはDigdagサーバーが別途コンテナを立てて実行します。今回はDigdagサーバー自体がコンテナであり、「コンテナからコンテナを起動する」という構図になっているため動作させるのに一苦労しました。解説は割愛しますがdoodという方式をとることで解決しました。
ではワークフローを実行していきます。
まずはdigdag_clientコンテナに入ります。
docker exec -it digdag_client bash
digdag_serverに向けてプロジェクトをプッシュします。
digdag push my-project -e http://digdag_server:65432
UIを確認するとプロジェクトがプッシュされていることがわかります。
ワークフローを実行します。今回はUIからRUNボタンを押して実行します。
まとめ
今回は単純な実行のみでしたがスケジュール実行やサーバーの細かい設定などまだまだ検証できそうな部分もあるので引き続き遊んで行こうと思います。