👈
docker exec -it の -it の意味
普段何気なくdocker
でコマンドを実行するときにつけている-it
のオプションが何を意味しているのか気になったので調べてみました。
公式ドキュメントによると、
オプション | 説明 |
---|---|
--interactive , -i | Keep STDIN open even if not attached |
--tty , -t | Allocate a pseudo-TTY |
STDIN
と TTY
)
あまりピンとこない... (特に Google it
STDIN とは
STDIN は、STanDard INput(標準入力)の略
キーボードからの入力のこと。
もう少しきちんと書くと
特になんにも指定されていない場合は、普通ここから入力されるよね~な通り道のこと
STDOUT(標準出力)もあるよ
画面への出力のこと。
もう少しきちんと書くと
特になんにも指定されていない場合は、普通ここに出力されるよ~な通り道のこと
TTY とは
TTYは、TeleTYpewriter の略。
tty【コマンド】とは、コンピュータさんに対する命令文(コマンド)のひとつであり、接続端末のデバイスファイル名を表示するときに使うUnix系のコマンド
うーん、とんでもなく初歩的な事を学んだ気がする。
それを踏まえて
-
-i
は、 Keep STDIN open even if not attached (常に標準入力は開けておく) -
-t
は、Allocate a pseudo-TTY (偽のデバイスファイル名を割り当てる)
この掛け合わせが -it
ということは、
コンテナに割り当てた偽のデバイスファイル名を指名して、こちら(本デバイス)の標準入力をコンテナに伝えられるようにする。
という意味かな。。。
他力本願
自信がなかったのでさらに調べてみると、-t
は Docker 内でインタラクティブシェルを起動させているという情報が見つかりました。
それなら確かに腑に落ちます。
-t
でシェルを起動して、-i
でそこに入力を受け取れる様にしている訳か。
References
シリーズ 〜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 〜
Discussion
ここらへんは実践したほうがわかりやすかったりしますね
-tつけないと端末が無いと判断されるので端末がある前提で作られたコマンドが動かなくなったりします
topコマンドとかsudoコマンドがそうですね
-t無し
-t有り
ttyがあるので正常に実行されました
そして-iですがdocker execを打った端末の標準入力をコンテナに繋げてくれるみたいな感じです
-i無し
-tつけてるんで標準出力にはそれっぽいの出ますが
コマンド打っても標準入力つないでないんで何も応答してくれません
このコンテナを落とす時はdocker psでコンテナ名を調べてdocker rm -f コンテナ名で落とす羽目になったりします
そして標準入力をつないでなかったのでコンテナを落とすとtopコマンドがホストOS側で入力されたことになってホストOSでtopコマンドが動きます
というわけで-itしないとbashとかのインタラクティブなコマンドが使えないっていう感じですね