1 min read
docker execをcronでやろうとしてハマった
定期的にコンテナ側で処理させたいことをシェルスクリプトに書いてcronに登録しておく。
やりたいことは単純に見えるが罠があった。
$ crontab -l
# m h dom mon dow command
0 1 * * * /home/tao/updateHoge.sh
$ cat updateHoge.sh
#!/bin/bash
docker exec -it site php hogehoge
docker exec -it site php fugafuga
毎日1時に/home/tao/updateHoge.sh
を実行するだけ。
なぜか動いてくれない
date > /home/tao/test.log
とかはcronに記述しても動いてくれた。
なぜだ?と思ってcronの実行コマンドとすぐログを見るために実行時刻を変えた。
16 6 * * * /home/tao/updateHoge.sh > /home/tao/cron.log 2>&1
$ cat /home/tao/cron.log
the input device is not a TTY
TTYからの入力じゃないんだがと怒られていた。
itオプションを付与しているので、execを実行した端末をコンテナ内のプロセスに割り当てる。
しかし、cronから実行すると端末からの実行ではないため、割り当てるべき端末がないとのことでexecが実行されていなかったようだ。
解決策
- 素直にitオプションを消す
- 端末からの実行かどうかの判定をしてitオプションを付与するか決める
今回は手動で実行して内容を確認したい可能性もあると思ったので後者で解決させた。
#!/bin/bash
if tty -s; then
option='-it'
else
option=''
fi
docker exec $option site php hogehoge
docker exec $option site php fugafuga
これで問題なくcronでdocker exec
ができるようになった。
満足。