はじめに
個人開発してるバッチ処理でcronで定期実行するため、
docker-compose exec
コマンドで設定していたが、
正しく実行されなかった。
その原因と対処法について調査したのでメモ。
調査
cronの実行ログを確認したところ、以下の内容が出力されていた。
the input device is not a TTY
調査していくと docker-compose exec
の場合、擬似TTYがデフォルトで割り当てされるためらしい。
ヘルプで確認してみた。
docker-compose exec -h Execute a command in a running container Usage: exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...] Options: -d, --detach Detached mode: Run command in the background. --privileged Give extended privileges to the process. -u, --user USER Run the command as this user. -T Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY. --index=index index of the container if there are multiple instances of a service [default: 1] -e, --env KEY=VAL Set environment variables (can be used multiple times, not supported in API < 1.25) -w, --workdir DIR Path to workdir directory for this command.
この影響でcronでコマンドが実行されなった模様。
対処法
cronで実行するには -Tオプション
をつける必要がある。
ということで対処法は以下の通り。
# NG docker-compose exec <サービス名> <実行コマンド> # OK docker-compose exec -T <サービス名> <実行コマンド>
ここで疑問
そもそも TTY
ってよく理解できていないことが分かった。。
ということで追加で調べてみた。
TTYとは?
wikipedia の記述だと以下の通り。
ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。 元来ttyとはteletypewriter(テレタイプライター)のことを指す。
うん、よく分からん。。
もうちょっと噛み砕くと、SSHなどでサーバーに接速した際に一時的に割り当てられるデバイス名を表示する際に利用する。
個人的に利用する以下のサイトを見るとより理解しやすい。
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
おわりに
運用していないと気づかないことも多々あるなと再認識。
その都度知らないことがわかるので、それはそれで面白いと思った今日この頃。
参考サイト
今回も参考にさせていただいたサイトは以下の通り。
先人達の知恵に感謝。