目次
1. 本記事の目的
書籍のチュートリアルで、
- 'Hello'とログファイルに標準出力するジョブ
- 1分周期でジョブを実行するcron
を、1つのコンテナで動かす実装を行った。
イメージを実行すると、1分経過するごとに 'Hello'とログが出力される想定だったが、当初エラーは出力されず、ログも出力されない結果となった。
原因はcronの構文誤りだった。
この問題を解決するまでに試したことや、その結果について記載する。
※ この記事では、MacOS Big Sur バージョン11.2.3を使用しています。
書籍
2. 修正前
修正前のディレクトリ構成、ファイルの内容は以下の通り。
【ディレクトリ構成】
cronjob/
├ cron-example/
├ Dockerfile/
└ task.sh/
【Dockerfile】
FROM ubuntu:16.04
# ubuntu:16.04 のイメージを利用する。イメージはDockerHubにある。
# ubuntuはLinuxディストリビューションの1つ。
RUN apt update
# ubuntuのパッケージマネージャaptを更新する。
RUN apt install -y cron
# aptで、cronをインストールする。
COPY task.sh /usr/local/bin/
COPY cron-example /etc/cron.d/
# 各ファイルをコピーし、コンテナに追加する(右側はコンテナ内のパス)。
RUN chmod 0644 /etc/cron.d/cron-example
# パーミッションを設定する
CMD ["cron","-f"]
# cronはバックグラウンドで動き続けるため、CMDとして実行すると、すぐに終了してしまう。
# このため、フォアグラウンドで実行させる(-fコマンド)。
【task.sh】
#!/bin/sh
echo "[`date`]Hello!" >> /var/log/cron.log
コマンド >> ファイル
Linuxのリダイレクト
コマンドの出力結果をファイルへ追記
参考:5分で一通り理解できる!Linuxのリダイレクト 使い方と種類まとめ
【cron-example】
task.shのジョブを毎分実行する
***** root sh /usr/local/bin/task.sh
【dockerコマンド】
ここではdockerコマンドを使用する。
イメージのビルド
docker image build -t example/cronjob:latest .
イメージの実行
docker container run -d --rm --name cronjob example/cronjob:latest
logファイル実行
docker container exec -it cronjob tail -f /var/log/cron.log
3. 試したこと
task.shは実行できるか
コンテナ内部に入り、shコマンドでtask.shを実行後、ログファイルに出力されるか確認する。
コンテナ内部に入る
docker exec -i -t コンテナ名 bash
task.shを実行する
sh /usr/local/bin/task.sh
ログファイルを確認する
cat /var/log/cron.log
cronの実行権限はあるか
コンテナ内で、cron-exampleがあるフォルダに移動し、0644の権限を確認する。
フォルダ移動
cd etc/cron.d
中身確認
ls
> cron-example
権限確認
ll
> -rw-r--r-- 1 root root 37 Apr 29 00:12 cron-example
最初の1文字目はファイル種別を表しています。
2文字目から4文字目はファイルの所有者に対する権限を表し、
5文字目から7文字目はファイルの所有グループに対する権限を表し、
8文字目から10文字目はその他に対する権限を表しています
最初の1文字目 : - ファイル
2~4 : rw- 6
5~7 : r-- 4
8~10 : r-- 4
権限は合っている。
crondが起動しているか
起動確認
service cron status
> * cron is running
起動している。
4. 解決
原因:cronの構文誤り
cronで1分周期を設定する場合、以下のように記載する。
*/1 * * * * root sh /usr/local/bin/task.sh
cron-exampleの修正を行い、イメージのビルド、コンテナの作成と実行を行った。
動作確認をしたところ、期待通りだった。
期待する動作は、イメージを実行すると、1分経過するごとに 'Hello'とログが出力されること。
実行結果
[Thu Apr 29 02:38:01 UTC 2021]Hello!
[Thu Apr 29 02:39:01 UTC 2021]Hello!