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


425

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

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

Jenkinsfileインタラクティブモードを実行せずにからスクリプトを実行する方法はありますか?

基本的script.shに、Dockerコンテナー内で実行したいというファイルがあります。


* nixの場合、解決策はないようです。「docker exec -i」は機能せず、「-t」も機能しません。
rjurney 2018

1
@rjurney docker execの解決策を見つけましたか?私は-iと-tを試したが成功しなかった。docker exec -it mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Hutch

@Hutch申し訳ありませんが、思い出せません:(
rjurney

回答:


639

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

または-i、TTYから来ていないdockerコマンドに入力がパイプされている場合は、に変更できます。コマンドラインに、xyz | docker ...またはdocker ... <inputコマンドラインに何かある場合は、これを実行します。

または、-tTTYサポートが必要であるが入力デバイスで使用できない場合は、に変更できます。これは、ログの出力の色の書式設定、または後で適切なターミナルを使用してコンテナーに接続するときに行います。

または、インタラクティブなターミナルが必要で、LinuxまたはMacOSのターミナルで実行されていない場合は、別のコマンドラインインターフェイスを使用します。PowerShellはWindowsでこのサポートを含むと報告されています。


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


10
mysql -pパスワードを指定せずにこのコマンドを使用しています。-iパスワードプロンプトを追加するだけでは表示されません。-tプロンプトを追加するだけで表示されますが、リターンを押しても、入力(プロンプトによって非表示になる代わりに文字どおりに出力されます)をまったく読み取らないようです。ctrl-cのみで終了できます。どういうわけか、DockerでMySQLクライアントをそのように使用できますか?
ohcibi 2018

95

Windowsでこのエラーとgit bashに苦労している人は、-it完全に機能するPowerShellを使用してください。


12
これは質問の答えにはなりません。問題は、Windowsのgit bashではなく、Jenkinsのdockerに関するものです。

45
上手。本当、そしてそれは決して意図されていませんでした。この特定のエラーメッセージを検索すると、Googleに質問がポップアップ表示されます。まったく答えないよりはどこかに答えを持っている方がいいと思った。明らかに一部の人々はそれが有用だと
思った

3
シェル操作のTTYとしてのPowershellの問題は、コマンド履歴の上向き矢印のように、矢印キーが適切に渡されないことです。その欠点以外は素晴らしい働きをします。
Corgalore

2
Git Bashを引き続き使用する場合は、別の質問でこの回答を参照するか、以下のwinpty回答を参照してください
tessafyi

68

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

-Tキーを使用している人の助けになるドッキングウィンドウ・コン幹部を!

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

2
まさに私が探していたもの。これが機能する理由を知っていますか?
Ulad Kasach

6
ちょうど私も必要なもの。ヘルプによると:-T疑似tty割り当てを無効にします。デフォルトでdocker-compose exec はTTYを割り当てます。
TS

ありがとう。docker-composeで検索!
ADyDyka

これは私のために働いた!
rlorenzo

59

(私のように)Windowsでgit bashを使用している場合は、

Winpty

あなたの「ドッカーライン」の前に:

winpty docker exec -it some_cassandra bash

どのようにダウンロードしますwinptyか?
Mor Shemesh 2018

6
質問する前に試しましたか?私はそれがGitに付属していると思います(私は... / Git / usr / binの中にあります)
Gremi64

あなたは正しい、それは下ですC:\Program Files\Git\usr\bin\winpty.exe
Mor Shemesh

31

dockerがTTY(-tオプション)を割り当てるには、TTYにいる必要があると思います。Jenkinsは、TTY ではなくジョブを実行します。

そうは言っても、Jenkins内で実行しているスクリプトは、ローカルで実行することもできます。その場合、TTYを割り当ててローカルで実行するときにctrl+のような信号を送信できるようにすると、非常に便利cです。

これを修正するには-t、次のように、オプションでオプションを使用します。

test -t 1 && USE_TTY="-t" 
docker run ${USE_TTY} ...

実行しているときにこのエラーは私に起こるdocker run…コマンド形式gitのフックによってトリガメイクタスク
エドゥアール・ロペス

1
これは受け入れられる答えになるはずです。それは実際に普遍的に適用可能な方法で問題に対処します
ルートハーン

11

「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'を使用すると、すべてうまくいきました。


bashを使用してこれらの問題を抱えて、頭も壁に数時間ぶつけました。Powershellに切り替えて、すべて動作するようになりました!
David Spenard、


1

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

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


1

私はこれが目の前の質問に直接答えているのではなく、WindowsとcmderまたはconemuでDockerを実行しているWSLを使用しているこの質問に出くわす人のために知っています。

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

Windows用Dockerの設定から有効にする必要があるポート2375で、Windows用Dockerに接続します。

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

または、-Hスイッチを省略できるdocker_host変数を設定します

export DOCKER_HOST=tcp://localhost:2375

これで、tty端末セッションと対話的に接続できるようになります。


0

以下に示す私のJenkinsパイプラインステップは、同じエラーで失敗しました。

       steps {
            echo 'Building ...' 
            sh 'sh ./Tools/build.sh'
        }

私の " build.sh "スクリプトファイル " docker run "コマンドでは、Jenkinsジョブによって実行されたときにこのエラーが出力されました。ただし、シェルターミナルでスクリプトを実行すると、問題なく動作しました。Dockerrunコマンドに-tオプションが渡されたためにエラーが発生しました。

私の場合、端末が検出された場合にのみ-tオプションを渡すようにスクリプトを変更しました。変更後のコードは次のとおりです。

DOCKER_RUN_OPTIONS="-i --rm"

# Only allocate tty if we detect one
if [ -t 0 ] && [ -t 1 ]; then
    DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -t"
fi

docker run $DOCKER_RUN_OPTIONS --name my-container-name  my-image-tag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.