LoginSignup
2
6

More than 1 year has passed since last update.

crond を実行する Docker コンテナを作成する

Last updated at Posted at 2022-02-06

ゴール

Amazon Linux 2 のイメージをベースに Supervisor 上で crond を実行する Docker コンテナを作成します。

この手順では、Amazon Linux 2 のイメージで Systemd を有効にするのではなく、フォアグラウンドで起動した crond を Supervisor で管理する戦略を採用します。

参考文書

事前要件

この文書の手順は、次の環境で実施し、動作を確認しました。

  • MacBook Air (M1, 2020)
  • macOS Monterey 12.1
  • Docker Desktop 4.4.2

手順

この手順は、最終的に次の構造のプロダクトを作成します。

ROOT
+-- Dockerfile
+-- cron
|   +-- root.conf
+-- supervisord.conf 

crond の動作確認で使用する cron の設定ファイル root.conf を作成します。

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.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.autostartprogram:cron.autorestart パラメーターは、必ず true に設定します。

stdoutstderr で始まるログファイルに関するパラメーターは、Docker コンテナの起動後に crond のログを標準出力、標準エラー出力へリダイレクトするために設定しています。

Dockerfile を作成します。

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
2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6