web-dev-qa-db-ja.com

エラー「入力デバイスはTTYではありません」

Jenkinsfileから次のコマンドを実行しています。しかし、エラーが発生します 「入力デバイスはTTYではありません」

docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh

対話モードを使わずにJenkinsfileからスクリプトを実行する方法はありますか?

私は基本的にscript.shという名前のファイルを持っていて、それをDockerコンテナの中で実行したいのです。

246
Anthony

それを非インタラクティブにするためにあなたのcliから-itを取り除き、TTYを取り除きます。どちらも必要ない場合は、 Jenkinsまたはcronスクリプト内でコマンドを実行する場合は、これを実行する必要があります。

TTYから来ていないdockerコマンドに入力された入力がある場合、あるいはそれを-iに変更することができます。コマンドラインにxyz | docker ...docker ... <inputのようなものがある場合は、これを行ってください。

TTYをサポートしたいが入力デバイスで利用できない場合は、-tに変更できます。ログ内の出力のカラーフォーマット、または後で適切な端末でコンテナに接続するときにこれを行います。

対話型端末が必要で、LinuxまたはMacOSの端末で実行していない場合は、別のコマンドラインインタフェースを使用してください。 PowerShellはWindowsでこのサポートを含むと報告されています。


TTYとは何ですか?これは、カラー出力、エスケープシーケンス、カーソルの移動などをサポートする端末インタフェースで、メインフレームに接続された昔のダム端末から来ています。今日では、Linuxのコマンド端末とsshインタフェースによって提供されています。詳細は wikipediaの記事を見てください

378
BMitch

Windowsでこのエラーに苦しんでgit bashをする人には、-itが完璧に動作するところでPowerShellを使ってください。

46
Piotr Justyna

もしあなたが(私のように)ウィンドウズ上でgit bashを使っているなら、あなたはただ置く必要があります。

空っぽ

あなたの 'docker line'の前に:

winpty docker exec -it some_cassandra bash
29
Gremi64

TTY(-tオプション)を割り当てることができるようにするには、dockerがTTYに参加している必要があります。 JenkinsはTTYでnotのジョブを実行します。

そうは言っても、あなたがJenkins内で実行しているスクリプトは、ローカルでも実行したい場合があります。その場合は、TTYを割り当てておくととても便利です。 ctrl+c ローカルで実行しているとき.

この問題を解決するには、次のようにスクリプトにオプションで-tオプションを使用させます。

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...
23
Gareth A. Lloyd

それはまさにあなたが求めているものではありませんが、:

-Tキーは、docker-compose exec!を使用しているユーザーを支援します。

docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
5
yestema

windowsを使用している場合は、cmdを試してください。 dockerが起動しているか確認してください。

私はこれが当面の質問に直接答えるのではなく、WindowsとcmderまたはconemuのためにDockerを実行しているWSLを使用しているこの質問に来る人のためのものです。

トリックは、Windowsの/ mnt/c/Program Files/Docker/Docker/resources/bin/docker.exeにインストールされているDockerを使用するのではなく、ubuntu/linux Dockerをインストールすることです。 Docker自体をWSL内から実行することはできませんが、Linux DockerクライアントからWindows用のDockerに接続することはできます。

LinuxにDockerをインストールする

Sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | Sudo apt-key add -
Sudo add-apt-repository "deb [Arch=AMD64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Sudo apt-get update
Sudo apt-get install docker-ce

ポート2375でDocker for windowsに接続します。これは、docker for windowsの設定から有効にする必要があります。

docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7

または、docker_Host変数を設定して、-Hスイッチを省略できるようにします。

export DOCKER_Host=tcp://localhost:2375

これで、tty端末セッションと対話的に接続できるはずです。

1
Damo

"。:/ mountpoint"や "$ {pwd}:/ mountpoint"のようにマウントするボリュームを指定しない限り、winptyは機能します。

私が見つけた最良の回避策は、Visual Code Studio内でgit-bashプラグインを使用し、ターミナルを使用してコンテナを起動および停止したり、docker-composeを実行することです。

1
Rusty1

「git bash」を使用する場合、

1)コマンドを実行します:

docker exec -it 726fe4999627 /bin/bash

私はエラーがあります:

the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

2)次に、コマンドを実行します:

winpty docker exec -it 726fe4999627 /bin/bash

別のエラーがあります:

OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"D:/Git/usr/bin/
bash.exe\": stat D:/Git/usr/bin/bash.exe: no such file or directory": unknown

3)3番目に、次を実行します。

winpty docker exec -it 726fe4999627 bash

出来た。

「powershell」を使用すると、すべてうまくいきました。

0
wangsir