どさんこウェブ

自分で調べた技術ネタの備忘録的な感じで徒然とブログを書いていこうかな

docker-compose execコマンドがcronで動作しない

はじめに

個人開発してるバッチ処理で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用語辞典

おわりに

運用していないと気づかないことも多々あるなと再認識。
その都度知らないことがわかるので、それはそれで面白いと思った今日この頃。

参考サイト

今回も参考にさせていただいたサイトは以下の通り。
先人達の知恵に感謝。