# 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 使う程度です。

2023-01-27
  • server
  • docker

関連記事

Laravel Address already in use の原因
AWS 504 Gateway Timeout エラー対応
デプロイツール Capistrano
AWS EC2 の amazon-linux-extras の話
AWS CloudWatch ログ監視で Lambda 処理
AWS Elastic Beanstalk 環境設定
Amazon DynamoDB 制限調査
Elastic Beanstalk \$\SERVER['REMOTEADDR'] 取得できない
AWS Elastic Beanstalk php.ini 設定変更
AWS SES メール開封確認  DB に集計
AWS のタイムゾーンを UTC 協定世界時から JST 日本標準時に変更
Shell と Bash のいろいろ
AWS Unresolved resource dependencies [AWSEBV2LoadBalancer] エラー
content-security-policy 設定
Centos7 Webserver 構築の時のメモ
DDNS 無料ダイナミック DNS サービス 4 つ
crontab 設定いろいろ
ディスク容量を確認する df コマンド
Windows の WSL Ubuntu で Docker を使う方法
Docker compose で LAMP 環境作成
Docker command でドッカー練習する時のメモ
Homebrew で Docker Desktop を再インストールエラー
Docker port error で起動できない
Docker Compose
Windows10 Home に Docker 入れた時のメモ
Docker の基本的な使い方
Docker WSL2 Laravel sail
VPS サーバーのセキュリティー fail2ban
ジェネレーティブ AI と大規模言語モデル(LLM)を学ぶためのリソース
Windows Mac Linux hosts ファイル場所
自宅サーバー構築!  Nextcloud で NAS クラウドストレージ
Nginx web サーバーのセキュリティ
Nginx 基本設定
Mac ターミナル SSH 接続設定
SPF メール送信なりすまし対策
メールサーバー移行と POP & IMAP 設定
robots.txt の書き方
youtube 見れるように vpn サーバー建ててみた
Ubuntu で Web サーバーを構築する手順
5 分で VPN サーバー立てる! wg-easy の使い方
よく使う WSL コマンド
xserver に nodejs インストール
積水ハウス 個人情報流出 SQL インジェクション攻撃か
xserver に vim インストール
レンタルサーバーなら xserver おすすめ理由
ZeroSSL で無料 SSL できるけど Let's Encrypt と比較
XZ Utils 事件対応
oh my zsh 使うべし
解決! xserver php バージョンアップした時に ssh 環境に反映されない
no such file or directory: /usr/share/zsh/vendor-completions/_docker
Vim 操作とショートカット