💭
DockerでAirflowの複数プロセスを立ち上げる
背景と目的
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でデプロイする方針を考える。
参考
Discussion