Docker Run Interactive (-i) ve TTY (-t) Parametrelerine Detaylı Bakış
Docker container'larla çalışırken, çalışan bir container'ın shell'ine düşmek istediğimizde her zaman -i
ve -t
parametreleriyle karşılaşırız. Ama ikisi gerçekte ne yapıyor? Kullanım senaryoları nelerdir? Bu sorulara ve cevaplarına bu yazımızda detaylı olarak değineceğiz.
Docker run
komutunda, -i
(Interactive) ve -t
(TTY) parametreleri kullanarak, bir Docker container'ı başlatır ve bu container ile etkileşimli olarak çalışabilirsiniz. Bu iki parametreye hızlı bir giriş yaparsak şu şekilde tanımlayabiliriz:
-i
parametresi, container'ın STDIN çalışmasına izin verir ve terminal ekranından veri girişi yapmanıza olanak tanır.-t
parametresi, container içinde TTY terminal yapısının oluşmasını sağlar. Bu, terminal üzerinde kullandığınız komutların çıktısının düzgün görüntülenmesini ve komut satırındaki etkileşimi sağlar.
Şimdi bu komutları uygulayacağımız senaryoları inceleyelim.
1. -i
Parametresi İle Input Almak
Varsayılan olarak, docker run
komutu, container içindeki işlemin standart giriş akışını (STDIN) host cihazın terminaline bağlamaz. Sadece standart çıkış (STDOUT) ve standart hata (STDERR) akışlarını bağlar. Yani, container'a herhangi bir girdi gönderemeyecek fakat yazdırılan çıktıları görebileceğiz.
- İlk senaryo olarak, eğer nginx imajını
-i
parametresi olmadandocker run -p 8080:80 nginx
komutuyla çalıştırırsak, input veremeyeceğimiz için container içindenCtrl+C
veya başka herhangi bir komutla çıkamayız. STDIN olmadan çalıştırılan containerları sadece farklı bir terminaldendocker container stop
komutuyla durdurabiliriz. - Diğer bir senaryoda ise, eğer container'ın ana işlemi bizden bir girdi bekliyorsa, STDIN'i eklemeden çalıştırmak, container'ın hemen exit ile sonlanmasına neden olur.
Bu senaryoyu gerçekleştirmek için, bir Ubuntu image'ı kullanarak passwd
komutunu çalıştıralım:
$ docker run ubuntu passwd root
New password: Password change has been aborted.
passwd: Authentication token manipulation error
passwd: password unchanged
Yukarıdaki örnek için passwd
komutunu seçtik çünkü komut etkileşim ve kullanıcı girişi gerektiriyor. Bu nedenle, aktif bir STDIN eklemeden başlattığımızda, komut hemen bir hatayla çıkıyor.
STDIN'i ana bilgisayar terminalinden container içindeki ana işleme eklemek için, docker run
komutunu çağırırken -i
parametresini geçiyoruz:
$ docker run -i ubuntu passwd root
New password:
Bu durumda komutun artık girdimizi beklediğini görüyoruz.
-i
seçeneğini geçtiğimizde docker run
komutu, input cihazını container içindeki ana işleme bağlamış olur.
2. -i
Parametresi İle Output'dan STDIN'e Akış Geçmek
Output pipe'ını, Docker container içindeki işlemin STDIN'inine de ekleyebiliriz. Örneğin, echo
komutunun output'unu container'daki bir cat
işlemine aktaralım:
$ echo "Kerteriz Blog" | docker run -i ubuntu cat
Kerteriz Blog
Yukarıdaki örnek, herhangi bir argüman olmaksızın, container içindeki cat
işlemini başlatır. Çağrıldığında, cat
akışın sonuna ulaşana kadar STDIN'den gelen herhangi bir inputu süresiz olarak işlemeye devam eder. echo
komutunun çıktısını cat
prosesine pipe ile aktardığınızda tek bir satır echo
çıktısı verdikten sonra container'ı sonlandırırır. Bunun nedeni, STDIN'in akışın sonuna ulaşmasıdır.
Bunu, terminal STDIN'inine eklediğimizde cat
komutunun davranışıyla karşılaştıralım:
$ docker run -i ubuntu cat
merhaba
merhaba
kerteriz blog
kerteriz blog
Bu örnekte, ilk satır, girdiğimiz girdidir ve enter tuşuna bastığımızda, cat
işlemi yalnızca input dizesini yankılar. Bu durumda, cat
işleminin STDIN'i kapatana kadar süresiz olarak devam ettiğini unutmayın.
3. -t
Parametresi İle Pseudo-Terminal (PTY) Açmak
Resmi belgesinde Docker, -t
parametresinin container içindeki işleme "sahte bir TTY (pseudo-tty) tahsis edeceğini" belirtir. TTY, Teletype'ın kısaltmasıdır ve temel giriş-çıkış sunan bir cihaz olarak yorumlanabilir. Pseudo TTY olmasının nedeni, fiziksel bir teletype gerektirmemesi ve ekran sürücüsü ile klavye sürücüsünün bir kombinasyonu kullanılarak benzer işlemi yapmasıdır.
Bu makale için, Pseudo TTY'yi Linux'ta komutları çalıştırmak ve çıktıları okumak için kullandığımız bir terminal konsolu olarak düşünmek yeterlidir.
3.1. -t
Parametresi Kullanmazsak Ne Olur?
Bir önceki bölümde, -i
parametresinin, terminali container içindeki ana process'e nasıl bağladığını gördük. Böylece, ilgili process ile sanki onu ana bilgisayarımızda çalıştırıyormuşuz gibi etkileşime geçebildik. Ancak, -t
parametresini interactive mod için docker run
komutuna geçirmeden, terminale özgü işlevlerin tümü çalışmayacaktır.
Örneğin, kullanıcıdan parola isteyen programların çoğu parola yazarken input'u ekranda göstermez. Böylece, parola terminalde gizlenir ve güvenlik sağlanır.
Hadi -i
seçeneği ile passwd
komutunu çalıştıralım ve istemi tamamlayalım:
$ docker run -i ubuntu passwd root
New password: 12345678
Retype new password: 12345678
passwd: password updated successfully
Tipik kullanımında, passwd
'nin parola girişimizi göstermediğini biliyoruz. passwd
'nin bunu gerçekleştirmesinin yolu, terminalin echo seçeneğini kapatmasıdır. Bu işlemi bir pseudo-TTY tahsis etmeden başlattığımız için terminalin echo-off
fonksiyonu burada devreye girmez ve -i
parametresi sayesinde girdiğimiz parola da ekranda gözükür.
Ek olarak, bash
gibi bazı programlar, girdinin bir TTY aygıtı olduğunu algılarlarsa çıktıyı farklı görüntüler. Örneğin, ls
komutunu bir TTY aygıtında çalıştırmak, bash'ın dosya ve dizin adlarını farklı şekilde renklendirmesine neden olur.
Örneğin, ubuntu üzerinde ls
komutu çalıştırdığımızda alacağımız çıktıyı görelim:
docker run -i ubuntu bash
Çıktıda göreceğiniz gibi kullanıcı, mevcut dizin bilgisi, dosya ve dizin renklendirmeleri gibi alışık olduğumuz standart terminal çıktısı yerine sadece düz bir dosya listesi görebiliyoruz.
Şimdi bir sonraki başlıkta -t
ile bu çıktıların nasıl olacağını kontrol edelim.
3.1. -t
Parametresi Kullanarak Terminal İşlevini Aktif Etmek
Üstteki başlıkta sadece -i
parametresini kullandığımızda STDIN'i aktif ederek host cihazdan container'a input girebilmiştik. Fakat ortada bir TTY olmadığı için terminal işlevleri pasif kalmıştı. Şimdi echo-off seçeneği de dahil olmak üzere terminal işlevlerini eksiksiz bir şekilde etkinleştirmek için -t
parametresini -i
parametresi ile birlikte iletebiliriz:
$ docker run -it ubuntu passwd root
New password:
Retype new password:
passwd: password updated successfully
Artık passwd
komutundaki echo-off seçeneği pseudo-TTY ortamında düzgün çalışıyor.
Diğer örneğimizdeki ls
komutunun da çıktısına hemen bakalım.
Resimde gördüğünüz gibi dosya ve dizinler renklendirildi, aktif kullanıcı ve dizin bilgisi de gözüktü. Yani normal terminal işlevleri çalışır hale gelmiş oldu.
Bu arada, -t
parametresini tek başına kullanmanın pek bir faydası yok gibi görünüyor. Sadece -t
kullandığınızda STDIN kullanamayacağınız için container interactive olmayacak.Komutunuzun çıktısı bir TTY cihazı gerektirmediği sürece yalnızca -t
parametresiyle bir container çalıştırmanıza da gerek yoktur.
Docker serimizin sıradaki yazısı için aşağıdaki bağlantıyla devam edebilirsiniz.