docker初学者です。間違えなどありましたら、ご指摘いただければ幸いです。
docker runのiオプションについて少し調べてみたました。
オプションiについて
docker公式では、以下のように書かれている。
-i, --interactive アタッチしていなくても STDIN を開き続ける
STDINは標準入力のことらしい。キーボードからの入力を可能にするとのこと。いつもお世話になっているわかりそうでわからないサイトには以下のように記載されていました。
キーボードからの入力だよ
「特に指定をしていないときは、ここから入力されたデータが来るはず!」なデータの通り道だよ
https://wa3.i-3-i.info/word11636.html
つまり、アタッチしなくても標準入力を開き続けるということだと思うが、よくわからないので実際にコマンドを打ってみました。!!
ubuntuイメージを使用して挙動を調べる
オプションありとなしのパターンで挙動を調べてみた!コンテナを起動してコンテナに入り、入力したコマンドが実行されるかを確認する。
##①まずdocker runで-iありで起動して挙動を確認
MacBook-Pro:~ $ docker run -it -d --name test ubuntu /bin/bash
d43a339cc5ca000850c680ddfe75721321d58f8ff45145bb504f4be95c3854f234
MacBook-Pro:~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d43a339cc5ca ubuntu "/bin/bash" 4 seconds ago Up 3 seconds test
STATUSの項目がUp 3 secondsになっていることから、上手くubuntuイメージの起動している。次にアタッチしてコンテナ内に入ってみる。
※コマンドについて
docker attach <image-name> : このコマンドを実行することでコンテナ内に入ることができる。コンテナ内ですでに実行しているシェルを使ってコンテナとのやりとりをする。また、コンテナから抜ける時は、exit
またはCtl+p からのCtl+q
を実行する。
exit
の場合は、コンテナから抜けるとともに、コンテナが停止してしまう。
Ctl+p からのCtl+q
の場合は、コンテナから抜けるだけで、コンテナを停止することはない。
今回はexitを使用してコンテナから抜けることにする。
MacBook-Pro:~ $ docker attach test
root@d43a339cc5ca:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@d43a339cc5ca:/# exit
MacBook-Pro:~ $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d43a339cc5ca ubuntu "/bin/bash" 26 seconds ago Exited (0) 7 seconds ago test
lsコマンドが実行されコンテナ内の情報が出力された。
exitを実行したため、コンテナ自体も停止しているのがわかる。
##②次に-iなしで起動してみる。
先ほどのコンテナは削除して、-iオプションなしで起動してみる。
MacBook-Pro:~ $ docker run -t -d --name test ubuntu /bin/bash
40b1356e365135c8c1df8514e64239156de4216927dec2bfdd0571972d11147d
MacBook-Pro:~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40b1356e3651 ubuntu "/bin/bash" 9 seconds ago Up 8 seconds test
問題なく起動している。次にattachして、コンテナ内で「ls」コマンドを入力して出力が返ってくるかを確認。
MacBook-Pro:~ $ docker attach test
root@40b1356e3651:/# ls
何も反応が返ってこない。
標準入力(キーバードからの入力情報など)ができない状態のため、出力はされていない。
コンテナから出る。
root@40b1356e3651:/# exit
MacBook-Pro:~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40b1356e3651 ubuntu "/bin/bash" 3 minutes ago Up 3 minutes test
exitで抜けたのに、コンテナが停止していない。。
STATUSの項目がUp 3 minutesとなっている。。
attachコマンドでコンテナ内に入った場合、exitコマンドを入力するとコンテナから抜けるかつコンテナが停止してしまうのだが、今回のケースではコンテナが起動したままであった。。
これは、-iオプションを付けない場合、標準入力ができないため、ubuntuイメージから起動したコンテナに対しては、exitコマンドを実行した情報すら伝わらないため、コンテナが終了せず起動しっぱなしのままであるのだと思う。
結論
以上-iオプションを付けずにコンテナを起動してしまうと、コマンドなどの入力情報がコンテナまで伝わらないということがわかった。(公式ドキュメント通りの挙動を確認できた!)