👈

docker exec -it の -it の意味

2021/07/14に公開
1

普段何気なくdockerでコマンドを実行するときにつけている-itのオプションが何を意味しているのか気になったので調べてみました。

https://docs.docker.com/engine/reference/commandline/exec/

公式ドキュメントによると、

オプション 説明
--interactive , -i Keep STDIN open even if not attached
--tty , -t Allocate a pseudo-TTY

あまりピンとこない... (特に STDINTTY )

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 ということは、

コンテナに割り当てた偽のデバイスファイル名を指名して、こちら(本デバイス)の標準入力をコンテナに伝えられるようにする。

という意味かな。。。

他力本願

自信がなかったのでさらに調べてみると、-tDocker 内でインタラクティブシェルを起動させているという情報が見つかりました。

それなら確かに腑に落ちます。

-t でシェルを起動して、-i でそこに入力を受け取れる様にしている訳か。

References

シリーズ 〜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 〜

https://wa3.i-3-i.info/word11636.html

https://wa3.i-3-i.info/word11637.html

https://wa3.i-3-i.info/word11668.html

Discussion

坦々狸坦々狸

ここらへんは実践したほうがわかりやすかったりしますね

-tつけないと端末が無いと判断されるので端末がある前提で作られたコマンドが動かなくなったりします
topコマンドとかsudoコマンドがそうですね

-t無し

$ docker run --rm ubuntu env TERM=xterm top -n 1
top: failed tty get

env指定しないと環境変数無いのでttyつなぐ前に落ちる

-t有り

$ docker run -t --rm ubuntu top -n 1
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 50.0 sy,  0.0 ni, 50.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  24025.9 total,   3840.1 free,  14251.6 used,   5934.2 buff/cache
MiB Swap:   2048.0 total,   2046.0 free,      2.0 used.   8657.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
      1 root      20   0    6116   1784   1308 R   0.0   0.0   0:00.03 top

ttyがあるので正常に実行されました

そして-iですがdocker execを打った端末の標準入力をコンテナに繋げてくれるみたいな感じです

-i無し

$ docker run -t --rm ubuntu bash
root@8d5cabcee45e:/# top

-tつけてるんで標準出力にはそれっぽいの出ますが
コマンド打っても標準入力つないでないんで何も応答してくれません

このコンテナを落とす時はdocker psでコンテナ名を調べてdocker rm -f コンテナ名で落とす羽目になったりします

そして標準入力をつないでなかったのでコンテナを落とすとtopコマンドがホストOS側で入力されたことになってホストOSでtopコマンドが動きます

というわけで-itしないとbashとかのインタラクティブなコマンドが使えないっていう感じですね