Dockerfile Komutları

Docker imajlarını oluştururken kullanılan Dockerfile’lar, bu imajların nasıl oluşturulacağını tanımlayan betiklerdir. İşte bu Dockerfile içerisinde kullanılan temel komutların detaylı bir açıklaması:

Dockerfile Komutları

 FROM :  Her Dockerfile’ın başlangıcında gelir. Temel alınacak imajı belirtir.

Örnek:

 LABEL :  İmaja meta bilgi eklemek için kullanılır.

Örnek:

 EXPOSE :  Konteynerin dışa açacağı portları belirtir.

Örnek:

 ENV :  Konteyner içerisinde kullanılacak ortam değişkenlerini tanımlar.

Örnek:

 ADD :  Yerel dosya/dizin veya bir URL’den dosyayı imaja ekler.

Örnek:

 COPY :  ADD komutuna benzer, ama daha basit. Sadece yerel dosya/dizini imaja kopyalar.

Örnek:

ADD ve COPY Arasındaki Farklar:

Temel İşlevsellik:

  • ADD: Yerel bir dosya/dizini veya bir URL’yi Docker imajına ekler. URL kullanılırsa, belirtilen adres üzerindeki dosyayı otomatik olarak indirir.
  • COPY: Sadece yerel bir dosya veya dizini Docker imajına kopyalar.

Sıkıştırma Dosyaları:

  • ADD: Bir tar arşivi gibi sıkıştırılmış dosyaları imaja eklerken otomatik olarak çözer.
  • COPY: Sıkıştırılmış dosyaları olduğu gibi kopyalar, otomatik çözme işlemi yapmaz.

Genel Tavsiye: Eğer özel bir nedeniniz yoksa (örn. otomatik arşiv çözme veya URL’den dosya eklemek gibi) genellikle COPY komutunu kullanmanız önerilir, çünkü işlevi daha basit ve açıktır.

 RUN :  İmaj oluşturulurken çalışacak komutları tanımlar.

Örnek:

 CMD :  Konteyner çalıştırıldığında varsayılan komutu belirtir.

Örnek:

 ENTRYPOINT :  CMD’den farklı olarak, ENTRYPOINT ile belirtilen komut değiştirilemez.

Örnek:

CMD ve ENTRYPOINT Arasındaki Farklar:

Varsayılan Komut ve Argümanlar:

  • CMD: Konteyner çalıştırıldığında varsayılan olarak çalışacak komut ve argümanları belirtir. Eğer Docker run komutu ile başka bir komut belirtilirse, CMD komutu geçersiz kılınır.
  • ENTRYPOINT: Konteynerin başlangıç komutunu belirtir ve bu komut, Docker run ile belirtilen komutla değiştirilemez.

Kullanım Senaryoları:

  • CMD: Eğer bir konteynerin varsayılan bir komutu olmasını istiyorsanız (ama bu komutu gerektiğinde değiştirmek istiyorsanız) CMD’yi kullanmalısınız.
  • ENTRYPOINT: Konteynerin bir komut dosyası veya uygulama gibi davranmasını istiyorsanız ve kullanıcının bu komutu değiştirmesini istemiyorsanız ENTRYPOINT kullanmalısınız.

Birlikte Kullanım:

  • CMD ve ENTRYPOINT birlikte kullanılabilir. Bu durumda, ENTRYPOINT komutu sabit bir komut olarak kalırken, CMD komutunda belirtilen argümanlar ENTRYPOINT’e eklenir.

Örnek:

Bu Dockerfile ile oluşturulan konteyneri çalıştırdığınızda, varsayılan olarak “cat /my_file.txt” komutu çalışacaktır. Eğer Docker run sırasında başka bir dosya belirtirseniz, o dosya cat komutuyla ekrana yazdırılır, fakat “cat” komutu değiştirilemez.

 VOLUME :  Konteynerde bir bağlama noktası oluşturur.

Örnek:

 USER :  Konteynerin hangi kullanıcı ile çalışacağını belirtir.

Örnek:

 WORKDIR :  Docker komutlarının çalışacağı dizini belirtir.

Örnek:

 ARG :  Build sırasında dışarıdan alınan değerleri tanımlar.

Örnek:

 ONBUILD :  Bir imaj başka bir Dockerfile’da temel olarak kullanıldığında çalışacak komutları belirtir.

Örnek:

 HEALTHCHECK :  Konteynerin sağlığını kontrol etmek için kullanılır.

Örnek:

 SHELL :  RUN, CMD, ENTRYPOINT için varsayılan kabuğu (shell) değiştirir.

Örnek:

.dockerignore Dosyası

.dockerignore dosyası, Docker imajı oluşturulurken Dockerfile’ın yanında bulunan ve bazı dosya veya dizinleri dikkate almayarak imaj oluşturma sürecinden hariç tutan bir dosyadır. Bu dosya, .gitignore dosyasına benzer bir işlevselliğe sahiptir, ancak Docker imajları için kullanılır.

Örnek .dockerignore Dosyası:

Bu örnekte, .bak uzantılı dosyalar, .git ve .svn dizinleri, node_modules dizini, config.yml dosyası ve tüm .log dosyaları Docker image oluşturma sürecinden hariç tutulmaktadır.

Dockerfile Dosyasından Image Oluşturma

Dockerfile dosyasından bir Docker imajı oluşturmak için docker build komutunu kullanmalısınız. Bu komut, belirttiğiniz Dockerfile’daki yönergeleri takip eder ve sonuç olarak bir Docker imajı üretir.

Terminal veya komut satırını açın ve Dockerfile’ın bulunduğu dizine gidin. Ardından aşağıdaki komutu çalıştırarak Docker imajını oluşturabilirsiniz:

Burada:

  • -t my-image-name:tag ile oluşturulan imaja bir isim (my-image-name) ve bir etiket (tag) atanır. Etiket belirtilmezse varsayılan olarak latest olarak ayarlanır.
  • Son karakter olan . , Dockerfile’ın bulunduğu mevcut dizini ifade eder.

Oluşturduğunuz imajın mevcut imajlar arasında olup olmadığını kontrol etmek için:

Bu komut, sistemdeki tüm Docker imajlarını listeler. Oluşturduğunuz imajın da bu listede yer aldığını görmelisiniz.

Dockerfile Yazım Şekilleri

Dockerfile’da iki farklı yazım şekli mevcuttur: shell ve exec formatı.

1. Shell Formatı

Bu format, komutları ve argümanları tek bir string içerisinde yazmayı gerektirir ve bu komutlar shell (/bin/sh -c) aracılığıyla çalıştırılır.

Örnekler:

Avantajlar ve Dezavantajlar:

  • Shell formatı, ortam değişkenlerini kullanmayı ve shell işlemlerini kolaylaştırır.
  • Ancak bu format, komutun PID 1 olarak çalışmasını engeller, bu da sinyallerin doğru bir şekilde yönetilmediği anlamına gelir. Konteyneri durdurmak istediğinizde problemlere neden olabilir.

2. Exec Formatı

Bu format, komutu ve argümanları JSON benzeri bir dizi içerisinde ayrı ayrı elemanlar olarak belirtir. Bu format shell olmadan komutu doğrudan çalıştırır.

Örnekler:

Avantajlar ve Dezavantajlar:

  • Exec formatı, komutun PID 1 olarak çalışmasını sağlar, bu da sinyallerin doğru bir şekilde yönlendirilmesini garantiler. Bu nedenle, bir uygulamanın konteyner olarak çalışmasını istediğinizde bu formatı kullanmanız önerilir.
  • Ancak, bu format ortam değişkenlerini ve shell özelliklerini doğrudan desteklemez. Bu gibi özelliklere ihtiyaç duyarsanız, komutunuzu bir shell script içerisine yazarak bu scripti çalıştırmalısınız.

Umarım “Dockerfile Komutları” başlıklı yazım sizin için faydalı olmuştur.

Şu yazılar da ilginizi çekebilir.

Docker Container Nedir? Docker Container Komutları

Dockerfile Nedir? Dockerfile Neden Önemlidir?

Yeni bir yazımda görüşmek üzere.

Happy coding!

Yorum Yazın