ゴール
Amazon Linux 2 のイメージをベースに Supervisor 上で crond を実行する Docker コンテナを作成します。
この手順では、Amazon Linux 2 のイメージで Systemd を有効にするのではなく、フォアグラウンドで起動した crond を Supervisor で管理する戦略を採用します。
参考文書
- How to install/run Cron in a Docker Container. jdeathe. January 13, 2017.
- martinrusev/cron_supervisord.ini. martinrusev. January 9, 2015.
- cron(8). The Linux Programming Interface. August 27, 2021.
- Supervisor. Agendaless Consulting and Contributors. February 06, 2022.
事前要件
この文書の手順は、次の環境で実施し、動作を確認しました。
- MacBook Air (M1, 2020)
- macOS Monterey 12.1
- Docker Desktop 4.4.2
手順
この手順は、最終的に次の構造のプロダクトを作成します。
ROOT
+-- Dockerfile
+-- cron
| +-- root.conf
+-- supervisord.conf
crond の動作確認で使用する cron の設定ファイル root.conf
を作成します。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
* * * * * /usr/bin/date >>/tmp/crontest.txt
root ユーザーが 1 分間隔で date
コマンドの実行結果を /tmp/crontest.txt
へ書き出すジョブを構成します。
Supervisor と Supervisor 上での cron の実行を制御する Supervisor の設定ファイル supervisord.conf
を作成します。
[supervisord]
nodaemon=true
loglevel=info
[program:cron]
command=crond -n -m off -x sch
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Supervisor と crond をフォアグラウンドで実行するため、supervisord.nodaemon
パラメーターは、必ず true
に設定します。
program:cron.command
パラメーターで指定する crond のオプションの意味は、次の通りです。
-
-n
- crond をフォアグラウンドで実行します。 -
-m off
- ジョブ実行時にメールを送信しないようにします。メールを送信したい場合、sendmail のようなメール送信プログラムのインストールが必要です。 -
-x sch
- ジョブスケジュールに関するデバック情報を出力します。
Supervisor の実行時に crond を自動で起動、再起動するため、program:cron.autostart
と program:cron.autorestart
パラメーターは、必ず true
に設定します。
stdout
と stderr
で始まるログファイルに関するパラメーターは、Docker コンテナの起動後に crond のログを標準出力、標準エラー出力へリダイレクトするために設定しています。
Dockerfile を作成します。
FROM amazonlinux:2
RUN yum install -y cronie-noanacron
RUN sed -i -e '/pam_loginuid.so/s/^/#/' /etc/pam.d/crond
COPY cron/root.conf /var/local/cron/
RUN crontab /var/local/cron/root.conf
RUN yum install -y python3 && pip3 install supervisor
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/local/bin/supervisord"]
crond をフォアグラウンドで実行する場合、crond で pam_loginuid.so
モジュールを無効にする必要があるため、sed -i -e '/pam_loginuid.so/s/^/#/' /etc/pam.d/crond
を実行しています。
docker build --rm -t cron-linux .
docker run --rm -it cron-linux /usr/local/bin/supervisord