Saya menjalankan perintah berikut dari Jenkinsfile
. Namun, saya mendapatkan kesalahan "Perangkat input bukan TTY" .
docker run -v $PWD:/foobar -it cloudfoundry/cflinuxfs2 /foobar/script.sh
Apakah ada cara untuk menjalankan skrip dari Jenkinsfile
tanpa melakukan mode interaktif?
Saya pada dasarnya memiliki file bernama script.sh
yang ingin saya jalankan di dalam wadah Docker.
docker
jenkins
jenkins-pipeline
Anthony
sumber
sumber
Jawaban:
Hapus
-it
dari cli Anda untuk membuatnya tidak interaktif dan hapus TTY. Jika Anda tidak perlu, misalnya menjalankan perintah di dalam Jenkins atau skrip cron, Anda harus melakukan ini.Atau Anda dapat mengubahnya menjadi
-i
jika Anda memiliki input yang disalurkan ke perintah buruh pelabuhan yang tidak berasal dari TTY. Jika Anda memiliki sesuatu sepertixyz | docker ...
ataudocker ... <input
di baris perintah Anda, lakukan ini.Atau Anda dapat mengubahnya
-t
jika Anda menginginkan dukungan TTY tetapi tidak tersedia di perangkat input. Lakukan ini untuk memformat warna output dalam log Anda, atau ketika Anda nanti menempelkan wadah dengan terminal yang tepat.Atau jika Anda memerlukan terminal interaktif dan tidak berjalan di terminal di Linux atau MacOS, gunakan antarmuka baris perintah yang berbeda. PowerShell dilaporkan menyertakan dukungan ini pada Windows.
Apa itu TTY? Ini adalah antarmuka terminal yang mendukung output warna, urutan keluar, memindahkan kursor, dll, yang berasal dari masa lalu terminal bodoh yang melekat pada mainframe. Hari ini disediakan oleh terminal perintah Linux dan antarmuka ssh. Lihat artikel wikipedia untuk lebih jelasnya .
sumber
mysql -p
tanpa menentukan kata sandi. Saat menambahkan-i
prompt kata sandi tidak pernah muncul. Dengan hanya menambahkan-t
prompt muncul tetapi tampaknya tidak membaca input (yang dicetak secara harfiah alih-alih disembunyikan oleh prompt) sama sekali, bahkan ketika memukul kembali; hanya ctrl-c yang bisa mengakhirinya. Apakah mungkin menggunakan klien mysql dengan buruh pelabuhan seperti itu?Bagi mereka yang berjuang dengan kesalahan ini dan git bash di Windows, cukup gunakan PowerShell di mana
-it
berfungsi dengan sempurna.sumber
Bukan itu yang Anda tanyakan, tetapi:
The key -T akan membantu orang-orang yang menggunakan buruh pelabuhan-compose exec!
sumber
docker-compose exec
mengalokasikan TTY.Jika Anda (seperti saya) menggunakan git bash di windows, Anda hanya perlu meletakkannya
sebelum 'docker line' Anda:
sumber
winpty
?C:\Program Files\Git\usr\bin\winpty.exe
Saya percaya Anda harus berada dalam TTY untuk buruh pelabuhan agar dapat mengalokasikan TTY (
-t
opsi). Jenkins menjalankan tugasnya bukan di TTY.Karena itu, skrip yang Anda jalankan dalam Jenkins Anda mungkin juga ingin dijalankan secara lokal. Dalam hal ini, akan sangat nyaman untuk memiliki alokasi TTY sehingga Anda dapat mengirim sinyal seperti ctrl+ cketika menjalankannya secara lokal.
Untuk memperbaikinya, buat skrip Anda menggunakan
-t
opsi secara opsional , seperti:sumber
docker run…
perintah dari tugas makefile yang dipicu oleh git hooksaat menggunakan 'git bash',
1) Saya menjalankan perintah:
Saya memiliki kesalahan:
2) lalu, saya menjalankan perintah:
Saya memiliki kesalahan lain:
3) ketiga, saya menjalankan:
itu berhasil.
ketika saya menggunakan 'PowerShell', semuanya bekerja dengan baik.
sumber
jika menggunakan windows, coba dengan cmd, bagi saya itu berfungsi. periksa apakah buruh pelabuhan dimulai.
sumber
winpty berfungsi selama Anda tidak menentukan volume yang akan dipasang seperti ".: / mountpoint" atau "$ {pwd}: / mountpoint"
Solusi terbaik yang saya temukan adalah menggunakan plugin git-bash di dalam Visual Code Studio dan menggunakan terminal untuk memulai dan menghentikan kontainer atau membuat docker-compose.
sumber
Saya tahu ini bukan langsung menjawab pertanyaan yang ada tetapi untuk siapa pun yang datang pada pertanyaan ini yang menggunakan WSL menjalankan Docker untuk windows dan cmder atau conemu.
Caranya bukan dengan menggunakan Docker yang diinstal pada windows di / mnt / c / Program Files / Docker / Docker / resources / bin / docker.exe tetapi untuk menginstal ubuntu / linux Docker. Perlu ditunjukkan bahwa Anda tidak dapat menjalankan Docker sendiri dari dalam WSL tetapi Anda dapat terhubung ke Docker untuk windows dari klien Docker linux.
Instal Docker di Linux
Hubungkan ke Docker untuk windows di port 2375 yang perlu diaktifkan dari pengaturan di docker untuk windows.
docker -H localhost:2375 run -it -v /mnt/c/code:/var/app -w "/var/app" centos:7
Atau atur variabel docker_host yang memungkinkan Anda menghilangkan -H switch
export DOCKER_HOST=tcp://localhost:2375
Anda sekarang harus dapat terhubung secara interaktif dengan sesi terminal tty.
sumber
Langkah pipa Jenkins saya yang ditunjukkan di bawah gagal dengan kesalahan yang sama.
Dalam skrip " build.sh " file " docker run " saya menampilkan kesalahan ini ketika dieksekusi oleh pekerjaan Jenkins. Namun itu berfungsi dengan baik ketika skrip dijalankan di terminal shell. Kesalahan terjadi karena opsi -t dilewatkan ke perintah run docker yang saya tahu mencoba mengalokasikan terminal dan gagal jika tidak ada terminal untuk mengalokasikan.
Dalam kasus saya, saya telah mengubah skrip menjadi opsi pass -t hanya jika terminal dapat dideteksi. Berikut adalah kode setelah perubahan:
sumber