The -t
pilihan pergi ke bagaimana Unix / Linux menangani akses terminal. Di masa lalu, terminal adalah koneksi garis keras, kemudian koneksi berbasis modem. Ini memiliki driver perangkat fisik (mereka adalah peralatan nyata). Setelah jaringan umum mulai digunakan, driver pseudo-terminal dikembangkan. Ini karena ini menciptakan pemisahan antara memahami kemampuan terminal apa yang dapat digunakan tanpa perlu menuliskannya langsung ke program Anda (baca halaman manual stty
, curses
).
Jadi, dengan itu sebagai latar belakang, jalankan wadah tanpa opsi dan secara default Anda memiliki aliran stdout ( docker run | <cmd>
berfungsi); dijalankan dengan -i
, dan Anda mendapatkan aliran stdin ditambahkan ( <cmd> | docker run -i
berfungsi); gunakan -t
, biasanya dalam kombinasi -it
dan Anda memiliki driver terminal ditambahkan, yang jika Anda berinteraksi dengan proses kemungkinan apa yang Anda inginkan. Ini pada dasarnya membuat wadah mulai terlihat seperti sesi koneksi terminal.
-it
bendera.docker run -i ubuntu
dandocker run -it ubuntu
Anda akan segera melihat perbedaannya. "-i" memungkinkan Anda untuk membuat wadah menunggu interaksi dari host tetapi interaksi sebenarnya dari konsol (terminal) dimungkinkan setelah Anda "mengalokasikan driver tty" dengan flag "-t".-t
, tetapi saya tidak dapat memodifikasi perintah mulai buruh pelabuhan dalam produksi. Jadi saya perlu membuat aplikasi berpikir itu dimulai dengan-t
.Jawaban terlambat, tetapi mungkin membantu seseorang
docker run/exec -i
akan menghubungkan STDIN dari perintah di dalam wadah ke STDINdocker run/exec
itu sendiri.Begitu
docker run -i alpine cat
memberi Anda garis kosong menunggu input. Ketik "halo" Anda mendapatkan gema "halo". Kontainer tidak akan keluar sampai Anda mengirim CTRL+ Dkarena proses utamacat
sedang menunggu input dari aliran tak terbatas yang merupakan input terminal daridocker run
.echo "hello" | docker run -i alpine cat
akan mencetak "halo" dan segera keluar karenacat
pemberitahuan bahwa aliran input telah berakhir dan berakhir dengan sendirinya.Jika Anda mencoba
docker ps
setelah Anda keluar dari salah satu di atas, Anda tidak akan menemukan wadah berjalan. Dalam kedua kasus,cat
itu sendiri telah berakhir, sehingga buruh pelabuhan telah mengakhiri wadah.Sekarang untuk "-t", ini memberitahu proses utama di dalam docker bahwa inputnya adalah perangkat terminal.
Begitu
docker run -t alpine cat
akan memberi Anda baris kosong, tetapi jika Anda mencoba mengetik "halo", Anda tidak akan mendapatkan gema. Ini karena saatcat
terhubung ke input terminal, input ini tidak terhubung ke input Anda. "Halo" yang Anda ketikkan tidak mencapai inputcat
.cat
sedang menunggu input yang tidak pernah tiba.echo "hello" | docker run -t alpine cat
juga akan memberi Anda garis kosong dan tidak akan keluar wadah CTRL- Dtetapi Anda tidak akan mendapatkan "halo" gema karena Anda tidak lulus-i
Jika Anda mengirim CTRL+ C, Anda mendapatkan shell Anda kembali, tetapi jika Anda mencoba
docker ps
sekarang, Anda melihatcat
wadah masih berjalan. Ini karenacat
masih menunggu aliran input yang tidak pernah ditutup. Saya belum menemukan penggunaan yang berguna untuk-t
sendirian tanpa digabungkan dengan-i
.Sekarang, untuk
-it
bersama. Ini memberitahu kucing bahwa inputnya adalah terminal dan pada saat yang sama menghubungkan terminal ini ke inputdocker run
yang merupakan terminal.docker run/exec
akan memastikan bahwa inputnya sendiri sebenarnya tty sebelum meneruskannyacat
. Inilah sebabnya mengapa Anda akan mendapatkaninput device is not a TTY
jika Anda mencobaecho "hello" | docker run -it alpine cat
karena dalam kasus ini, inputdocker run
itu sendiri adalah pipa dari gema sebelumnya dan bukan terminal tempatdocker run
dieksekusiAkhirnya, mengapa Anda harus lulus
-t
jika-i
akan melakukan trik menghubungkan input Anda kecat
input? Ini karena perintah memperlakukan input secara berbeda jika terminal. Ini juga digambarkan dengan contohdocker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -u root -p
akan memberi Anda prompt kata sandi. Jika Anda mengetikkan kata sandi, karakter dicetak dengan jelas.docker run -i alpine sh
akan memberi Anda garis kosong. Jika Anda mengetik perintah sepertils
Anda mendapatkan output, tetapi Anda tidak akan mendapatkan output berwarna atau prompt.Dalam dua kasus terakhir, Anda mendapatkan perilaku ini karena
mysql
jugashell
tidak memperlakukan input sebagai tty dan karenanya tidak menggunakan perilaku spesifik tty seperti menutupi input atau mewarnai output.sumber
-t
dan-i
opsi lakukan!The
-t
Argumen TIDAK didokumentasikan dengan baik, atau disebutkan oleh banyak orang sering, menurut pencarian Google.Bahkan tidak muncul ketika Anda menampilkan daftar (apa yang seharusnya) semua argumen klien buruh pelabuhan dengan mengetik
docker
di Bash prompt (dengan versi terbaru 1.8.1).Bahkan, jika Anda mencoba untuk mendapatkan bantuan khusus tentang argumen ini dengan mengetikkan
docker -t --help
jika memberikan jawaban yang sangat samar-samar ini:Jadi, Anda tidak dapat disalahkan karena bingung dengan argumen ini!
Ada disebutkan dalam dokumentasi online Docker yang mengatakan itu untuk "Alokasikan pseudo-tty" dan sering digunakan dengan
-i
:https://docs.docker.com/reference/run/
Saya melihatnya digunakan dalam dokumentasi untuk
jwilder/nginx-proxy
wadah buruh pelabuhan hebat dengan cara berikut:Dalam hal ini, yang dilakukannya adalah mengirim output ke tty 'virtual' (Bash command prompt / terminal) di dalam wadah buruh pelabuhan ini. Anda kemudian dapat melihat output ini dengan menjalankan perintah buruh pelabuhan di
docker logs CONTAINER
manaCONTAINER
pasangan karakter pertama dari ID penampung ini. ID KONTAINER ini dapat ditemukan dengan mengetikdocker ps -a
Saya telah melihat
-t
argumen ini disebutkan secara singkat di tautan berikut, di mana dikatakanhttps://coreos.com/os/docs/latest/getting-started-with-docker.html
Saya harap ini membantu! Saya tidak yakin mengapa ini tidak didokumentasikan atau digunakan banyak. Mungkin ini eksperimental dan akan diimplementasikan sebagai fitur yang terdokumentasi di versi mendatang.
sumber
docker run --help
, bukandocker -t --help
:-t, --tty=false Allocate a pseudo-TTY
"Yang saya tahu tentang
-t
ini adalah sebagai berikut:docker exec -ti CONTAINER bash
- memungkinkan saya untuk "masuk" dalam wadah. Rasanya seperti ssh-ing (bukan).Tetapi masalahnya adalah ketika saya ingin mengembalikan database.
Biasanya saya lakukan
docker exec -ti mysql.5.7 mysql
- Di sini saya menjalankan perintah mysql dalam wadah dan mendapatkan terminal interaktif.Saya menambahkan
<dump.sql
ke perintah sebelumnya sehingga saya dapat mengembalikan db. Tetapi gagal dengancannot enable tty mode on non tty input
.Menghapus bantuan
-t
. Masih tidak mengerti mengapa:Yang terakhir berhasil. Semoga ini bisa membantu orang.
sumber
-t
, tetapi saya tidak dapat memodifikasi perintah mulai buruh pelabuhan dalam produksi. Jadi saya perlu membuat aplikasi berpikir itu dimulai dengan-t
.Di linux ketika Anda menjalankan perintah, Anda memerlukan terminal (tty) untuk menjalankannya.
Jadi ketika Anda ingin terhubung ke buruh pelabuhan (atau menjalankan perintah dalam wadah buruh pelabuhan), Anda harus memberikan opsi -t yang mempertimbangkan terminal di dalam wadah buruh pelabuhan.
sumber
Setiap proses memiliki tiga aliran data yaitu
STDIN/ STDOUT/ STDERR
. Ketika suatu proses berjalan dalam sebuah wadah, terminal default terhubung dengan aliran STDOUT dari proses yang berjalan dalam wadah. Karenanya semua aliran keluaran akan terlihat saat menjalankandocker run
perintah di terminal. Tetapi jika Anda ingin memberikan input untuk proses yang berjalan dalam wadah maka Anda harus terhubung dengan saluran STDIN dari proses yang tidak secara default dan dilakukan dengandocker run -i
perintah.-t
digunakan untuk operasi input interaktif / diformat.sumber
Itu
-it
menginstruksikan Docker untuk mengalokasikan pseudo-TTY terhubung ke stdin wadah, menciptakan sebuah shell bash interaktif dalam wadah.--interactive
,-i
false
Tetap buka STDIN meskipun tidak terpasang--tty
,-t
false
Alokasikan pseudo-TTYhttps://docs.docker.com/engine/reference/commandline/run/
sumber