# Docker Supervisor 使ってバッチ処理
Supervisor(スーパーバイザ) とは
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
Supervisor は複数のプロセスを監視、制御管理できるプロセス管理システムです。数のプロセスを同時にバックグラウンドで管理するために開発された Linux 用のシステムで特に Docker の Linux 環境において、複数デーモンをコンテナ内で同時稼働させるツールとして、広く利用されています。
# インストール
Supervisor をインストール (Ubuntu の場合)
RUN apt update && apt install -y supervisor
RUN mkdir -p /var/log/supervisor
Docker COPY 使って Supervisor の設定ファイルを追加
/etc/supervisor/conf.d/
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Supervisor config
supervisor の設定ファイル supervisord.conf に
Laravel schedule を利用する際の supervisor ファイル設定例
[supervisord]
nodaemon=true
[program:laravel-schedule]
user=root
process_name=%(program_name)s_%(process_num)02d
command=sh -c "while true; do /usr/bin/php /var/www/html/artisan schedule:run; sleep 60s; done"
autostart=true
autorestart=true
numprocs=1
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
httpd と vsftpd を同時に稼働させるための supervisor 設定
[supervisord]
nodaemon=true
[program:httpd]
command=/usr/sbin/httpd -k start
[program:vsftpd]
command=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Ubuntu なら apache2 でしょうね
SSH と Apache2 を同時に稼働するための supervisor 設定
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
nginx 稼働するための supervisor 設定
[supervisord]
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
# program 配下項目一覧
| 項目 | 説明 |
|---|---|
| command | 実行するコマンド |
| autostart | 自動起動 ON/OFF |
| autorestart | 自動再起動 ON/OFF |
| stopsignal | 終了時に発行するシグナル |
| stopsignal | 終了時に発行するシグナル |
| stdout_logfile | 標準ログファイル |
| stderr_logfile | エラーログファイル |
# Dcokerfile コマンド指定
コンテナポート 22 と 80 番を解放するようにと、コンテナ起動時に /usr/bin/supervisord バイナリを起動するコマンドを指定します。
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
Dockerfile の全体イメージ
FROM ubuntu:22.04
RUN apt update && apt install -y openssh-server apache2 supervisor
RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/run/sshd /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
# 要注意
supervisor は便利ですが、使い方次第でチャタリングやコンテナ即死するので、使う際の要注意ポイント
# nodaemon を true にする
これを true にしないと daemon モードで起動します(こちらがデフォルト)。
daemon モードで起動してしまうと、Container 立ち上げ時にすぐプロセスを手放してしまい Container が終了します。
supervisor を設定したけどいざ docker run したら一瞬で container が止まってしまったという場合は大体これが原因です 。
daemon モードがデフォルトのため、設定ファイルの最初にnodaemon=trueと設定した方が良い
# service などのコマンド使わない
コマンド指定する際に、対象のプログラムの実行パスから書く必要があり、service や/etc/init.d 下の起動スクリプトは自身サービス起動後に終了するため、supervisor がサービス自身を捕捉できません。
# Supervisor の基本コマンド
supervisorctl help でコマンド一覧表示できます。
$ supervisorctl help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
基本的な add reload restart stop はよく使いますが、Docker で利用する際、ほとんど Docker の再起動になるので、たまに supervisorctl status 使う程度です。