コンテナを起動する

docker run --rm --name example -itd alpine

オプションなしだと出力なしで終了する

docker execにオプションを渡さないとコンテナ外の標準入力は無視される。

$ docker exec example cat - /etc/hostname
> 10ebf333b3ac
$ echo hello | docker exec example cat - /etc/hostname
> 10ebf333b3ac

オプションを指定して標準入力を引き継げる

docker exec--interactiveオプションを渡すと標準入力をコンテナ内のコマンドに引き継げる。

$ docker exec -i example cat - /etc/hostname
< test
> test
< ^C # => 入力待ちになるため中断するにはSIGINTを送信する必要あり
$ echo hello | docker exec -i example cat - /etc/hostname
> hello
> 10ebf333b3ac

疑似端末を使用すると入力を待ち続ける

docker exec--ttyオプションを渡すと疑似端末側の入力を待ち続けるため処理が終了しない。

$ docker exec -t example cat - /etc/hostname
< ^C # => 入力待ちになるため中断するにはSIGINTを送信する必要あり
$ echo hello | docker exec -t example cat - /etc/hostname
< ^C # => 入力待ちになるため中断するにはSIGINTを送信する必要あり

両方のオプションを渡すと端末が一致しないエラーになる

docker exec--interactive--tty両方のオプションを渡すとコンテナ外の入力端末と疑似端末が異なるためコンテナ外から標準入力を引き継ぐことができない。

$ docker exec -it example cat - /etc/hostname
< test
> test
< ^C # => 入力待ちになるため中断するにはSIGINTを送信する必要あり
$ echo hello | docker exec -it example cat - /etc/hostname
> the input device is not a TTY