はじめに
docker run コマンドや docker exec コマンドを実行する際に -i オプションと -t オプションを付与することが多いですが、
理解をしていないとパイプとつなぐ際に思わぬ挙動をするので整理しました。
検証環境
| |
各種オプションの有無での挙動の違い
-i オプション有り、 -t オプション有り
まずは -it オプションつきでDockerコンテナを起動し bash を起動してみます。
接続したコンテナ内でLinuxコマンドを実行でき、結果をターミナルで確認できます。
| |
-i オプション無し、 -t オプション無し
両方のオプションを外した場合はどうでしょう?
| |
コンテナは直ちに終了してしまいます。
-i オプション無し、 -t オプション有り
今度は -t オプションだけ付与して実行してみます。
| |
先ほどと異なり、インタラクティブなBashが起動できました。
-t オプションについてヘルプを見てみます。
| |
-t はtty(擬似端末)をコンテナに割り当てるためのオプションです。
これによりBashがインタラクティブモードで起動することとなります。プロンプトも表示されていますね。
ここで ls と入力し、Enterキーを押してみます。
ls の結果が何も出力されないはずです。
exit もできなくなりました。
こうなると CTRL+C で抜けるしかありません。
-i オプション有り、 -t オプション無し
今度は -i オプション付きだけを付与してみます。
| |
何も表示されませんが、ここで ls と入力してみます。
| |
プロンプトがないのでわかりにくいですが、一番上の ls は自分で入力したコマンドです。
-i オプションがあって初めて、コマンドの入力が可能となります。
逆に -i オプションだけでコンテナに対する操作はできます(-tは必要ない)。
ちなみに、以下のように vim をインストールして起動することもできました。
| |
パイプと組み合わせてみる(標準入力)
単体でのコンテナ起動の挙動は確認できました。 今度はパイプと組み合わせた場合の挙動について確認してみます。
echo ls | ... というコマンド形式で、コンテナ起動時に標準入力を受け取るようにしてみます。
-i オプション有り、 -t オプション有り
両方のオプションを付与した場合は、正常に動作しません。
| |
入力デバイスがTTYでないので -t を付与してはいけないようです。
-i オプション無し、 -t オプション無し
以下のコマンドでは何も出力されません。 コンテナが標準入力を受け付けないためです。
| |
以下のコマンドを実行したのと同じです。
| |
-i オプション無し、 -t オプション有り
インタラクティブシェルが起動しますが、標準入力を受け取るようにしていないため何もできません。
| |
以下のコマンドを実行したのと同じです。
| |
-i オプション有り、 -t オプション無し
正しく標準入力を受け取り、 ls コマンドが実行されます。
実行後、コンテナは終了します。
| |
パイプと組み合わせてみる(標準出力)
-i オプション有り、 -t オプション有り
何故か、おかしなインデントが出力されてしまいます。
| |
-i オプション無し、 -t オプション無し
正常に動作。
| |
-i オプション無し、 -t オプション有り
正常に動作。
| |
-i オプション有り、 -t オプション無し
正常に動作。
| |
フィルダリングを行うようなコンテナ起動を行う場合
標準入力を受け取り、標準出力を送り込むコンテナ起動用のコマンドは以下のようになります。
| |
ひとこと
コンテナにフィルダリング処理をさせるという発想はどうなんでしょうね。 問題があるのかないのか。