Hata "Giriş cihazı bir TTY değil"


425

Aşağıdaki komutu çalıştırıyorum Jenkinsfile. Ancak, "Giriş aygıtı bir TTY değil" hatasını alıyorum .

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

Komut dosyasını Jenkinsfileetkileşimli mod yapmadan çalıştırmanın bir yolu var mı ?

Temelde script.shDocker kapsayıcısında çalıştırmak istediğiniz adlı bir dosya var .


* Nix için, burada çözüm yok gibi görünüyor. 'docker exec -i' çalışmaz ve '-t' çalışmaz.
rjurney

1
@rjurney Docker exec için hiç bir çözüm buldunuz mu? -İ ve -t'yi hiç denemeden denedim. docker exec - mycontainer bash certbot --apache -d www.website.com --email *********@gmail.com --agree-tos -n
Hutch 8

@Hutch Üzgünüm, hatırlayamıyorum :(
rjurney

Yanıtlar:


639

Kaldır -itsenin cli dan olmayan etkileşimli hale ve TTY'yi kaldırın. İkisine de ihtiyacınız yoksa, örneğin komutunuzu bir Jenkins veya cron betiğinin içinde çalıştırmak, bunu yapmanız gerekir.

Veya bir -iTTY'den gelmeyen docker komutuna giriş yaptıysanız bunu değiştirebilirsiniz . Komut satırınızda xyz | docker ...veya benzeri bir şey varsa docker ... <input, bunu yapın.

Veya -tTTY desteği istiyorsanız, ancak giriş cihazında yoksa bunu değiştirebilirsiniz . Günlüklerinizdeki çıktının renk biçimlendirmesi için veya daha sonra uygun bir terminal ile kaba bağlandığınızda bunu yapın.

Veya etkileşimli bir terminale ihtiyacınız varsa ve Linux veya MacOS'ta bir terminalde çalışmıyorsa, farklı bir komut satırı arayüzü kullanın. PowerShell'in bu desteği Windows'ta içerdiği bildiriliyor.


TTY nedir? Ana çıktılara bağlanmış aptal terminallerin eski günlerinden gelen, renk çıktısını, kaçış dizilerini, imleci hareket ettirmeyi vb. Destekleyen bir terminal arabirimidir. Bugün Linux komut terminalleri ve ssh arabirimleri tarafından sağlanmaktadır. Daha fazla bilgi için wikipedia makalesine bakın .


10
Bu komutu mysql -pbir şifre belirtmeden kullanıyorum. Sadece -işifre eklerken istem asla görünmez. Sadece -tbilgi istemi ekleyerek görünür ama dönüşü vururken bile, girişi (istemi tarafından gizlenmek yerine tam anlamıyla yazdırılır) okumaz gibi görünüyor; sadece ctrl-c bitirebilir. Bir şekilde mysql istemcisini docker ile bu şekilde kullanmak mümkün mü?
ohcibi

95

Bu hatayla ve Windows'ta git bash ile mücadele edenler için, -itmükemmel çalışan PowerShell'i kullanın .


12
Bu soruya cevap vermiyor. Soru, Windows'ta git bash değil, Jenkins'teki docker ile ilgili.

45
İyi. doğru ve asla amaçlanmadı. Bu özel hata mesajını aradığınızda soru Google'da açılır. Ben cevabı hiç bir yere sahip olmamaktan daha iyi bir yerde bulmayı düşündüm . Açıkçası bazı insanlar yararlı buldu :)
Piotr Justyna

3
Kabuk işlemleri için Powershell'in TTY olarak sorunu, komut komutu geçmişi için yukarı ok gibi ok tuşlarını düzgün şekilde geçmemesidir. Bu eksiklik dışında harika çalışıyor.
Corgalore


68

Tam olarak sorduğunuz şey değil, ama:

-T anahtarı kullanan kişilere yardımcı olacağını liman işçisi-oluşturma exec!

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

2
tam olarak aradığım şey. bunun neden işe yaradığını biliyor musun?
Ulad Kasach

6
Tam da ihtiyacım olan şey. Yardıma göre: -T Yalancı tty tahsisini devre dışı bırak. Varsayılan olarak docker-compose exec bir TTY ayırır.
TS

Teşekkürler dostum. Docker-compose için arıyorum!
ADyDyka

Bu benim için çalıştı!
rlorenzo

59

Windows'ta git bash kullanıyorsanız (benim gibi),

winpty

'docker hattınızdan' önce:

winpty docker exec -it some_cassandra bash

nasıl indirebilirim winpty?
Mor Shemesh

6
Sormadan önce denedin mi? Bence Git ile geliyor (benim içeride ... / Git / usr / bin)
Gremi64

Haklısın, altındaC:\Program Files\Git\usr\bin\winpty.exe
Mor Shemesh

31

Docker'ın bir TTY tahsis edebilmesi için bir TTY'de olmanız gerektiğine inanıyorum ( -tseçenek). Jenkins TTY'de olmayan işlerini yürütür .

Bunu söyledikten sonra Jenkins içinde çalıştırdığınız script yerel olarak da çalıştırabilirsiniz. Bu durumda, yerel olarak çalıştırırken ctrl+ gibi sinyaller gönderebilmeniz için bir TTY'nin tahsis edilmesi gerçekten uygun olabilir c.

Bunu düzeltmek için komut dosyanızı isteğe bağlı olarak şu şekilde kullanın -t:

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

Bu hata docker run…, git kanca tarafından tetiklenen bir makefile görevi komutunu çalıştırdığımda başıma geliyor
Édouard Lopez

1
kabul edilen cevap bu olmalıdır. aslında sorunu evrensel olarak uygulanabilir bir şekilde ele alıyor
roothahn

11

'git bash' kullanırken,

1) Komutu çalıştırıyorum:

docker exec -it 726fe4999627 /bin/bash

Hata var:

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

2) sonra, şu komutu yürütürüm:

winpty docker exec -it 726fe4999627 /bin/bash

Başka bir hata var:

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) üçüncü olarak, ben:

winpty docker exec -it 726fe4999627 bash

işe yaradı.

'powershell'i kullandığımda hepsi iyi çalıştı.


Bash kullanarak bu konularla birkaç saat boyunca kafamı da duvara çarptım. Powershell'e geçti ve şimdi hepsi çalışıyor!
David Spenard

5

Windows kullanıyorsanız, cmd ile deneyin, benim için çalışıyor. docker'ın başlatılıp başlatılmadığını kontrol edin.


1

winpty, ".: / mountpoint" veya "$ {pwd}: / mountpoint" gibi monte edilecek birimleri belirtmediğiniz sürece çalışır.

Bulduğum en iyi geçici çözüm, Visual Code Studio'da git-bash eklentisini kullanmak ve kapsayıcıları veya docker-compose'u başlatmak ve durdurmak için terminali kullanmaktır.


1

Bunun doğrudan eldeki soruya cevap vermediğini, ancak bu soru üzerine gelen ve Windows ve cmder veya conemu için Docker'ı WSL çalıştıran herkes için biliyorum.

Hile / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe adresindeki pencerelere yüklenen Docker'ı kullanmak yerine ubuntu / linux Docker'ı kurmaktır. Docker'ın kendisini WSL içinden çalıştıramayacağınızı belirtmek gerekir, ancak linux Docker istemcisinden Windows için Docker'a bağlanabilirsiniz.

Docker'ı Linux'a yükleyin

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'daki ayarlardan etkinleştirilmesi gereken 2375 numaralı bağlantı noktasındaki pencereler için Docker'a bağlanın.

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

Veya -H anahtarını atlamanıza izin verecek docker_host değişkenini ayarlayın

export DOCKER_HOST=tcp://localhost:2375

Artık bir tty terminal oturumuyla etkileşimli olarak bağlanabilmelisiniz.


0

Aşağıda gösterilen Jenkins boru hattı adımım aynı hatayla başarısız oldu.

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

Benim " build.sh " komut dosyası " docker run " komutunda Jenkins işi tarafından çalıştırıldığında bu hatayı çıktı. Ancak komut dosyası kabuk terminalinde çalıştırıldığında Tamam çalışıyordu. Hata , docker run komutuna iletilen -t seçeneği nedeniyle terminali ayırmaya çalışır ve tahsis edilecek terminal yoksa başarısız olur.

Benim durumumda sadece bir terminal algılanabiliyorsa betiği pass -t seçeneğine değiştirdim. Değişikliklerden sonraki kod şöyledir:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.