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ができるようになった。
満足。

参考