2017-10-30 11 views
2

sockコマンドから直接的にドッキング・コンテナを対話的に実行したいとします。docker run -it over ssh:入力デバイスがTTYではありません

次のように私の現在のコードは、(私はプレースホルダとしてecho hiを使用しています)が表示されます:

$ ssh [email protected] -p 2222 "docker run -ti ubuntu:xenial echo hi" 
the input device is not a TTY 

私はまた、明示的に対話的なログインシェルを作ってみた:

$ ssh [email protected] -p 2222 "bash -ilc 'docker run -ti ubuntu:xenial'" 
bash: cannot set terminal process group (-1): Inappropriate ioctl for device 
bash: no job control in this shell 
the input device is not a TTY 

I sshの場合コマンドをインタラクティブに実行すると、うまくいきます。

$ ssh [email protected] -p 2222 
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-34-generic x86_64) 

* Documentation: https://help.ubuntu.com/ 
---------------------------------------------------------------- 
    Ubuntu 14.04.5 LTS       built 2016-08-26 
---------------------------------------------------------------- 
Last login: Mon Oct 30 23:25:35 2017 from 10.0.2.2 
[email protected]:~$ docker run -ti ubuntu:xenial echo hi 
hi 

ここでは何が欠けていますか?

答えて

3

デフォルトの操作としてリモート対話型シェルを実行しているときとは異なり、明示的なコマンドが引数リストに渡された場合、SSHはデフォルトでTTYを設定しません。この問題を回避するには、-ttを追加します。

$ ssh -tt [email protected] -p 2222 "docker run -ti ubuntu:xenial echo hi" 

単一-tがあれば、リモートTTYを設定し、ローカルTTYが存在する場合にのみ。 -ttは無条件で実行されます。 ...

Host vagrant 
    HostName 127.0.0.1 
    Port 2222 
    User vagrant 
    RequestTTY force 

として使用:

$ ssh -o 'RequestTTY force' [email protected] -p 2222 \ 
> 'docker run -ti ubuntu:xenial echo hi' 
...または ~/.ssh/config中:

RequestTTYオプションも、コマンドライン上で、明示的に設定することができ

ssh vagrant 'docker run -ti ubuntu:xenial echo hi' 

Q the man page for ssh

-t - 強制擬似端末割り当て。これは、 リモートマシン上の任意のスクリーンベースのプログラムを実行するために使用できます。 など非常に便利です。メニューサービスを実装するとき複数の-t オプションは、sshにローカルttyがない場合でも、tty割り当てを強制します。 the ssh_config man page引用

RequestTTY - セッションのための仮想端末を要求するかどうかを指定します。 no(TTYを要求することはありません)、yes (標準入力がTTYであるときは、常にTTYを要求)、force (常にTTYを要求)またはauto(リクエストTTYを ログインを開く: 引数は、のいずれかになりますセッション)。このオプションは、 ssh(1)の-tと-Tフラグを反映します。

関連する問題