DockerでAirflowの複数プロセスを立ち上げる

3683 ワード

背景と目的

DockerでAirflowの開発環境を構築しているときに、コンテナをビルドし直す度にコンテナに入ってwebserverやschedulerを起動するのが手間だったため、コンテナ立ち上げ時にAirflowを起動できないか検討した。

結論

1コンテナ複数プロセスは良くないと知りつつ、公式のドキュメントを見て、Supervisordを使った。

supervisordとは

プロセス監視ツール。ユーザに代わってプロセスを監視し、再起動などを行ってくれる。
簡単な使用方法などは、公式ドキュメント参照。

各種設定

Dockerfile
FROM python:3.9-slim

# supervisorをinstall
RUN apt-get update -y && \
    apt-get install --no-install-recommends -y -q \
    git libpq-dev python3-dev build-essential supervisor && \ 
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# airflowをinstall
RUN pip install --upgrade pip && \
    pip install apache-airflow[gcp] 

# configをコンテナの所定の箇所に配置
COPY ./dev/airflow.conf /etc/supervisor/conf.d/airflow.conf

# 配置したconfigファイルをsupervisorで実行
CMD [ "/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/airflow.conf" ]
airflow.conf
[supervisord]
nodaemon=true
user=root

[program:airflow]
command=/usr/local/bin/airflow webserver
stopsignal=QUIT
stopasgroup=true
user=root
[program:airflowscheduler]
command=/usr/local/bin/airflow scheduler
stopsignal=QUIT
stopasgroup=true
killasgroup=true
user=root
autorestart=true

[supervisord]はグローバルの設定。
nodeamon:フォアグラウンドプロセスとして実行させるか
user:どのユーザー権限で実行させるか
[program]は各プロセスの設定。
command:実行コマンド
autorestart:自動再起動ON/OFF
stopsignal:終了時に発行するシグナル
stopasgroup:プロセス全体を終了させるか
killasgroup:子プロセスもまとめて終了させる

設定ファイルは/etc/supervisor/supervisord.conf にあるが、次のように設定ファイルをincludeしているらしいので、/etc/supervisor/conf.d/airflow.confを配置する。

[include]
files = /etc/supervisor/conf.d/*.conf

参考:https://zenn.dev/hashito/articles/caa579a9aa8b4f

考察

この設定でGCP上にデプロイして動かすこともできた。
1コンテナに詰め込んでいるためかメモリもけっこう食っている。
コスト使ってしまうので学習用で使うのは避けていたが、次はコストを下げつつGKEでデプロイする方針を考える。

参考