Docker Run Interactive (-i) ve TTY (-t) Parametrelerine Detaylı Bakış
6 min read

Docker Run Interactive (-i) ve TTY (-t) Parametrelerine Detaylı Bakış

Docker Run Interactive (-i) ve TTY (-t) parametreleri STDIN ve shell işlevlerini kullanmanızı sağlar.
Docker Run Interactive (-i) ve TTY (-t) Parametrelerine Detaylı Bakış
Photo by Mikkel Jönck Schmidt / Unsplash

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 olmadan docker run -p 8080:80 nginx komutuyla çalıştırırsak, input veremeyeceğimiz için container içinden Ctrl+C veya başka herhangi bir komutla çıkamayız. STDIN olmadan çalıştırılan containerları sadece farklı bir terminalden docker 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.

💡
TTY ve Pseudo-TTY arasındaki fark, TTY'nin fiziksel bir terminalde çalışması ile Pseudo-TTY'nin ise sanal bir terminalde çalışmasıdır. TTY, bir seri port aracılığıyla bir bilgisayar veya terminalde kullanıcı-sistem arasındaki veri alışverişini sağlar. Pseudo-TTY, bir sistem terminal uygulaması olan sanal bir terminaldir ve gerçek bir TTY terminalinden farklı olarak, bir uygulamanın terminalle iletişim kurmasına olanak tanı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.

Docker CMD ve ENTRYPOINT Komutları
Docker CMD ve ENTRYPOINT komutları, Dockerfile içinde belirli bir konteyner için çalıştırılacak komutları tanımlayan iki farklı anahtardır.