遅い答えですが、誰かを助けるかもしれません
docker run/exec -i
コンテナ内のコマンドのSTDINをdocker run/exec
それ自体のSTDINに接続します。
そう
docker run -i alpine cat
入力を待っている空の行を提供します。「hello」と入力すると、エコー「hello」が表示されます。メインプロセスcat
がの端末入力である無限ストリームからの入力を待機しているため、CTRL + Dを送信するまでコンテナは終了しませんdocker run
。
- 一方、入力ストリームが終了し、それ自体が終了した
echo "hello" | docker -i run alpine cat
ことにcat
気付くため、「hello」を出力してすぐに終了します。
docker ps
上記のいずれかを終了した後に試しても、実行中のコンテナは見つかりません。どちらの場合も、cat
それ自体が終了したため、dockerはコンテナを終了しました。
「-t」の場合、これは入力が端末デバイスであることをdocker内のメインプロセスに伝えます。
そう
docker run -t alpine cat
空の行が表示されますが、「hello」と入力しても、エコーは表示されません。これはcat
、端末入力に接続されている間、この入力は入力に接続されていないためです。入力した「ハロー」はの入力に達しませんでしたcat
。cat
到着しない入力を待っています。
echo "hello" | docker run -t alpine cat
また、空の行を提供し、CTRL-Dでコンテナを終了しませんが、パスしなかったためエコー「hello」を取得しません -i
CTRL + Cを送信すると、シェルが返されますが、docker ps
今すぐ試してみると、cat
コンテナーがまだ実行されていることがわかります。これは、cat
閉じられなかった入力ストリームをまだ待機しているためです。と-t
組み合わせずに単独での有用な使用を発見していません-i
。
今、-it
一緒に。これは、その入力が端末であると同時に、この端末を端末である入力に接続することをcatに伝えdocker run
ます。docker run/exec
に渡す前に、それ自身の入力が実際にttyであることを確認しcat
ます。これは、この場合、それ自体の入力が前のエコーからのパイプであり、実行される端末ではないため、input device is not a TTY
試してみると取得される理由ですecho "hello" | docker run -it alpine cat
docker run
docker run
最後に、入力をの入力に接続するトリックを実行する-t
場合、なぜ合格する必要がありますか?これは、端末の場合、コマンドは入力を異なる方法で処理するためです。これは、例によって最もよく説明されています-i
cat
docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -p
パスワードプロンプトが表示されます。パスワードを入力すると、文字が表示されます。
docker run -i alpine sh
空の行が表示されます。ls
出力を取得するようなコマンドを入力しても、プロンプトまたは色付きの出力は表示されません。
最後の2つのケースでは、この動作を得るmysql
だけでなく、としてshell
の入力をマスキングまたは出力を着色するようにttyの特定の動作を使用していなかったので、ttyのように、入力を処理していなかったと。