から次のコマンドを実行していますJenkinsfile
。しかし、「入力デバイスはTTYではありません」というエラーが表示されます。
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
Jenkinsfile
インタラクティブモードを実行せずにからスクリプトを実行する方法はありますか?
基本的script.sh
に、Dockerコンテナー内で実行したいというファイルがあります。
から次のコマンドを実行していますJenkinsfile
。しかし、「入力デバイスはTTYではありません」というエラーが表示されます。
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
Jenkinsfile
インタラクティブモードを実行せずにからスクリプトを実行する方法はありますか?
基本的script.sh
に、Dockerコンテナー内で実行したいというファイルがあります。
回答:
-it
CLIからを削除して非インタラクティブにし、TTYを削除します。Jenkinsまたはcronスクリプト内でコマンドを実行するなど、どちらも必要ない場合は、これを実行する必要があります。
または-i
、TTYから来ていないdockerコマンドに入力がパイプされている場合は、に変更できます。コマンドラインに、xyz | docker ...
またはdocker ... <input
コマンドラインに何かある場合は、これを実行します。
または、-t
TTYサポートが必要であるが入力デバイスで使用できない場合は、に変更できます。これは、ログの出力の色の書式設定、または後で適切なターミナルを使用してコンテナーに接続するときに行います。
または、インタラクティブなターミナルが必要で、LinuxまたはMacOSのターミナルで実行されていない場合は、別のコマンドラインインターフェイスを使用します。PowerShellはWindowsでこのサポートを含むと報告されています。
TTYとは何ですか?これは、メインフレームに接続された昔のダム端末のカラー出力、エスケープシーケンス、カーソルの移動などをサポートする端末インターフェイスです。今日では、Linuxコマンド端末とsshインターフェースによって提供されています。詳細については、ウィキペディアの記事を参照してください。
mysql -p
パスワードを指定せずにこのコマンドを使用しています。-i
パスワードプロンプトを追加するだけでは表示されません。-t
プロンプトを追加するだけで表示されますが、リターンを押しても、入力(プロンプトによって非表示になる代わりに文字どおりに出力されます)をまったく読み取らないようです。ctrl-cのみで終了できます。どういうわけか、DockerでMySQLクライアントをそのように使用できますか?
Windowsでこのエラーとgit bashに苦労している人は、-it
完全に機能するPowerShellを使用してください。
それはあなたが求めているものとは正確ではありませんが、:
-Tキーを使用している人の助けになるドッキングウィンドウ・コン幹部を!
docker-compose -f /srv/backend_bigdata/local.yml exec -T postgres backup
docker-compose exec
はTTYを割り当てます。
(私のように)Windowsでgit bashを使用している場合は、
Winpty
あなたの「ドッカーライン」の前に:
winpty docker exec -it some_cassandra bash
winpty
か?
C:\Program Files\Git\usr\bin\winpty.exe
dockerがTTY(-t
オプション)を割り当てるには、TTYにいる必要があると思います。Jenkinsは、TTY ではなくジョブを実行します。
そうは言っても、Jenkins内で実行しているスクリプトは、ローカルで実行することもできます。その場合、TTYを割り当ててローカルで実行するときにctrl+のような信号を送信できるようにすると、非常に便利cです。
これを修正するには-t
、次のように、オプションでオプションを使用します。
test -t 1 && USE_TTY="-t"
docker run ${USE_TTY} ...
docker run…
コマンド形式gitのフックによってトリガメイクタスク
「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'を使用すると、すべてうまくいきました。
Windowsを使用している場合は、cmdで試してください。dockerが起動しているか確認してください。
私はこれが目の前の質問に直接答えているのではなく、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端末セッションと対話的に接続できるようになります。
以下に示す私の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