Ana içeriğe geç

Docker ENTRYPOINT Açıklaması: Kullanım, Sözdizimi ve En İyi Uygulamalar

Exec ve shell sözdizimi, CMD kullanımı, çalışma anı geçersiz kılmaları ve gerçek dünya örnekleriyle Docker ENTRYPOINT’i ustaca kullanın. Daha net ve güvenilir konteynerler oluşturun.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Docker ENTRYPOINT, konteyneriniz her başlatıldığında çalıştırılan varsayılan komutu tanımlayan ve kontrol eden bir Dockerfile yönergesidir. ENTRYPOINT'i ustalaşarak beklenen şekilde davranan öngörülebilir, tekrarlanabilir ve sürdürülebilir konteynerler geliştirmeyi kolaylaştırırsınız. 

Bu rehber, orta seviye DevOps mühendislerinin, backend geliştiricilerin ve yazılım mühendislerinin ENTRYPOINT'i güvenle kullanmasına ve yaygın hatalardan kaçınmasına yardımcı olmayı amaçlar.

Docker'a yeniyseniz, bu eğitimin Docker hakkında belirli bir anlayış gerektirdiği için Docker öğreticimize göz atın. Docker ile pratik yapmak için Introduction to Docker kursumuza bakın. 

Docker ENTRYPOINT nedir?

ENTRYPOINT, Docker konteyneriniz başlatıldığında varsayılan olarak yürütülen komutu tanımlar. CMD kullanmaktan farklı olarak, ENTRYPOINT yönergesi konteyner her başlatıldığında komutların çalışmasını sağlayarak tutarlılık sunar.

Docker ENTRYPOINT nasıl çalışır?

Bir Dockerfile içindeki ENTRYPOINT, bir imajdan konteyner başlattığınızda her zaman çalışan ana komutu tanımlar. Şöyle demek gibidir: “Kullanıcı bu konteyneri çalıştırırken hangi argümanları verirse versin, her zaman bu komutla başla.”

Dockerfile'lar hakkında daha fazla ayrıntıya Docker kullanarak bir uygulama nasıl konteynerleştirilir öğreticimizde giriyoruz. 

Örneğin, bir Dockerfile içinde:

ENTRYPOINT ["python", "app.py"]

Şimdi şunu çalıştırdığınızda:

docker run myimage

Her zaman şunu çalıştıracaktır:

python app.py

ENTRYPOINT'in nasıl çalıştığına dair bir akış diyagramı burada:

+---------------------------+

|       Dockerfile          |

+---------------------------+

|                           |

|  ENTRYPOINT ["app"]       |

|  CMD ["--default-arg"]    |

+---------------------------+

             |

             v

+---------------------------+

|   Build Docker Image      |

+---------------------------+

             |

             v

+---------------------------+

|    Run Container          |

|   (docker run image)      |

+---------------------------+

             |

             v

+---------------------------+

| Executed Command:         |

|   app --default-arg       |

+---------------------------+

Override CMD at Runtime:

(docker run image --custom-arg)

             |

             v

+---------------------------+

| Executed Command:         |

|   app --custom-arg        |

+---------------------------+

Override ENTRYPOINT at Runtime:

(docker run --entrypoint /bin/bash image)

             |

             v

+---------------------------+

| Executed Command:         |

|   /bin/bash               |

+---------------------------+

Docker ENTRYPOINT'in Temelleri

Temelleri anlamak, ENTRYPOINT'i etkili biçimde kullanma konusunda güveninizi önemli ölçüde artıracaktır.

Kavramsal çerçeve

ENTRYPOINT, konteyneriniz başladığında otomatik olarak çalışacak yürütülebilir dosyayı veya betiği belirtir. Bu, konteynerinizin ana sürecidir ve davranışını öngörülebilir şekilde yönlendirir.

Çekirdek sözdizimi

ENTRYPOINT için Dockerfile sözdizimi basittir ve genellikle varsayılan argümanlar veya parametreler sağlamak üzere CMD ile birlikte kullanılır. ENTRYPOINT yürütülebilir komutu tanımlarken, CMD ENTRYPOINT tarafından kullanılacak varsayılan argümanları belirtir.

ENTRYPOINT gibi Docker kavramlarını anlamak, veri bilimi mülakatlarında başarılı olmak için kritiktir. 2025 İçin En İyi 26 Docker Mülakat Sorusu ve Cevabı içeriğimizde yaygın soruları keşfedin. 

ENTRYPOINT Sözdizimi Biçimleri

Docker ENTRYPOINT iki farklı biçimde gelir: shell ve exec biçimi. Bu biçimler arasındaki farkları bilmek doğru seçimi yapmanıza yardımcı olur.

Shell biçimi

Örnek sözdizimi: 

ENTRYPOINT /usr/bin/ping -c 3 localhost

Shell biçimi, kabuk özelliklerinin (değişken ikamesi, ortam değişikliği) kolay entegrasyonunu sağlar.

Ancak zayıf sinyal işleme sorunlarına yol açabilir; doğrudan PID 1 olarak değil, ara bir /bin/sh süreci içinde çalışır, bu da konteynerleri durdurma ve yeniden başlatmada problemlere neden olur.

PID 1, sistem önyüklemesi sırasında başlatılan ilk süreçtir. Docker'da PID 1 süreci, konteyner içindeki diğer tüm süreçleri yönetir. 

Exec biçimi

Örnek sözdizimi: 

ENTRYPOINT ["/usr/bin/ping", "-c", "3"]

Exec biçimi, komutun doğrudan PID 1 olarak yürütülmesini sağlar; bu da güvenilir sinyal işleme ve kontrol sunar.

Bununla birlikte, doğrudan kabuk desteği veya otomatik ortam değişkeni genişletmesi yoktur; kabuk benzeri davranış için ek betikleme gerekir.

ENTRYPOINT ve CMD: Temel Farklar ve Kullanım Alanları

ENTRYPOINT ile CMD'yi ayırt etmek kafa karışıklığını önler ve öngörülebilir konteyner davranışı sağlar.

Yürütme önceliği

ENTRYPOINT, her zaman çalışacak yürütülebilir komutu ayarlarken CMD varsayılan argümanları sağlar. Hem ENTRYPOINT hem de CMD tanımlıysa, ENTRYPOINT önceliklidir ve çalışma anında açıkça geçersiz kılınmadıkça CMD'nin değerlerini argümanları olarak kullanarak yürütülür.

Kullanım senaryoları

ENTRYPOINT, her başlatmada tutarlı ve zorunlu bir yürütme istediğinizde kullanılmalıdır; örneğin tek komutlu konteynerler veya eski uygulamalar etrafında sarmalayıcı betikler. Buna karşılık, CMD, çalışma anında geçersiz kılmalara esneklik tanıyarak varsayılan argümanları belirtmek için uygundur.

Özellik

ENTRYPOINT

CMD

Amaç

Her zaman çalışan yürütülebilir

Varsayılan argümanlar

Geçersiz kılınabilir mi?

Yalnızca docker run --entrypoint ile

Evet, komut satırı argümanlarıyla

Birlikte kullanım

CMD, ENTRYPOINT'e argüman sağlar

Çalışma anında komut geçilirse yok sayılır

Tipik kullanım

Sabit davranış (örn. uygulamayı çalıştır)

İsteğe bağlı yapılandırma (örn. varsayılan bayraklar)

Konteynerleri Oluşturmak, Çalıştırmak ve Yönetmek İçin En İyi 18 Docker Komutu içeriğimiz, konteyner temel bilgilerinden volume'lara ve ağ oluşturmaya kadar temel Docker komutlarını kapsar; böylece uygulamaları ortamlara güvenle taşıyabilirsiniz.

Pratik örnek

Aşağıdaki Dockerfile, ENTRYPOINT ve CMD'nin tipik bir kombinasyonunu göstermektedir:

FROM ubuntu
ENTRYPOINT ["/usr/bin/ping", "-c", "3"]
CMD ["localhost"]

Bu Docker konteyneri, varsayılan olarak her zaman localhost'a üç ping gönderir. Kullanıcılar, ENTRYPOINT'in öngörülebilir yürütme davranışını koruyarak bu varsayılan hedefi çalışma anında başka ana bilgisayarlarla kolayca geçersiz kılabilir:

docker run ping-container google.com

Docker ile uygulama dağıtımı hakkında daha fazla bilgiyi Docker ve Kubernetes ile Konteynerleştirme ve Sanallaştırma kursumuzdan edinebilirsiniz. 

ENTRYPOINT ile CMD'yi Birleştirme

ENTRYPOINT ile CMD'yi doğru biçimde birleştirmek, tutarlılıktan ödün vermeden esneklik sağlar.

Varsayılan argüman olarak CMD

ENTRYPOINT'i ayarlamak ana komutu güvenilir biçimde tanımlar; CMD ise imajları yeniden oluşturmadan kolayca geçersiz kılınabilecek varsayılan parametreleri sağlar.

Çalışma anında argüman geçersiz kılmaları

docker run sırasında belirtilen argümanlar yalnızca CMD ile tanımlanan varsayılanları geçersiz kılar. ENTRYPOINT tutarlı kalır ve bu da kullanıcı deneyimini basitleştirir.

ENTRYPOINT'i Çalışma Anında Geçersiz Kılma

Docker, ENTRYPOINT'i doğrudan çalışma anında geçersiz kılmaya izin verir; böylece Dockerfile imajınızı yeniden oluşturmadan hata ayıklama yapabilirsiniz.

Entrypoint bayrağı kullanımı

Docker, konteyner davranışını geçici olarak değiştiren basit bir --entrypoint bayrağı sağlar.

docker run -it --entrypoint /bin/bash my-container

Geçici geçersiz kılmalar, kabuğu kullanarak sorun gidermeyi mümkün kılar; yaygın başlangıç sorunlarını imajı yeniden oluşturmadan veya ciddi gecikmeler olmadan çözersiniz.

ENTRYPOINT Davranışını Özelleştirme

Docker, ENTRYPOINT daha gelişmiş özelleştirme gerektirdiğinde esneklik sunar.

ENTRYPOINT'i çalışma anında geçersiz kılma

ENTRYPOINT komutunu, Dockerfile'ınızı tekrar tekrar değiştirmeden hızlıca bağlam değiştirmek veya hata ayıklamak için docker run --entrypoint kullanarak çalışma anında dinamik olarak geçersiz kılabilirsiniz. 

Argümanlı ENTRYPOINT

Konteynerlere iletilen argümanlar çalışma anında ENTRYPOINT parametreleri haline gelir; en iyi uygulamalar, azami açıklık ve kontrol için ENTRYPOINT karmaşıklığının minimumda tutulmasını ve CMD ile birlikte kullanılmasını önerir.

Sarmalayıcı betikler

ENTRYPOINT komutları olarak eklenen Bash betikleri, bağımlı servisleri (veritabanları gibi) beklemek, kurulum görevlerini yönetmek ve daha fazlası için koşullu başlangıç mantığı çalıştırabilirken temiz bir Dockerfile sözdizimi sağlar.

Gerçek Dünya Örnekleri ve Kalıplar

Pratik ENTRYPOINT uygulamaları, tipik ve gerçekçi kullanımları gösterebilir. Bazılarına bakalım.

Tek komutlu konteynerler 

Bir Flask uygulaması kurulumu için:

FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]

Yukarıdaki Dockerfile'da:

  • ENTRYPOINT ["python", "app.py"]  varsayılan yürütülebiliri ayarlar. Konteyner başladığında çalışan şey budur.
  • CMD ["--port", "8080"]  ENTRYPOINT komutuna varsayılan argümanlar (--port 8080) sağlar.

Yürütülen tam varsayılan komut şudur:

python app.py --port 8080

 Konteyneri çalıştırırken CMD'yi geçersiz kılarsanız (örn. docker run myimage --port 9090), --port 8080 yerine geçecektir.

ENTRYPOINT olarak betik 

Bu, koşullu mantık ayarlamak için kullanılır: 

entrypoint.sh:

#!/bin/sh
until nc -z db_host 5432; do
  echo "Waiting for database to become available."
  sleep 2
done
exec python app.py "$@"

Dockerfile:

FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD ["--port", "8080"]

Yukarıdaki dosyalarda:

  • entrypoint.sh, veritabanı bağlantısını beklemek için kullanılır.
  • exec python app.py "$@"  geçerli kabuk sürecini python app.py ile değiştirir ve ek argümanları iletir. "$@", CMD veya docker run parametrelerinden gelir.
  • COPY entrypoint.sh  entrypoint.sh betiğini konteynerin /app dizinine kopyalar.
  • ENTRYPOINT ["./entrypoint.sh"] konteyner çalıştığında varsayılan başlangıç betiği olarak entrypoint.sh'yi ayarlar.
  • CMD ["--port", "8080"], entrypoint.sh betiğine ve nihayetinde python app.py'ye iletilecek varsayılan argümanları sağlar. Son yürütülen komut şu şekilde olacaktır: python app.py --port 8080. 

Sinyal İşleme ve PID 1

ENTRYPOINT'in biçimi, PID 1'in önemi nedeniyle Docker'ın sinyalleri işleme yeteneğini önemli ölçüde etkiler. Bunu daha ayrıntılı inceleyelim: 

Exec biçimi ve PID 1

Exec biçimi, komutları Docker'ın PID 1 süreci olarak doğrudan çalıştırır; bu da sinyal iletiminin güvenilirliğini ve düzgün durdurma veya yeniden başlatma davranışını artırır.

Shell biçiminin sınırlamaları

Shell biçimi, araya bir kabuk süreci ekler. Bu, sonlandırma sinyallerinin uygulama süreçlerine ulaşmasını engelleyerek takılı kalan veya yanıt vermeyen konteyner riskini doğurur.

ENTRYPOINT Davranışını Hata Ayıklama

entrypoint yapılandırmalarında sorun gidermek, belirli teknikler ve püf noktalarıyla daha kolaydır. Aşağıda bunları keşfedelim. 

Hata ayıklama için --entrypoint kullanma

Geçici geçersiz kılmalar, imajı yeniden oluşturmadan konteynerleriniz içinde etkileşimli hata ayıklama kabuklarını hızlıca etkinleştirir. Bu, imajı yeniden oluşturmadan uygulamanızda farklı şeyleri denemenize olanak tanır. 

ENTRYPOINT günlüklerini görüntüleme

docker logs ile çıktı günlüklerini kontrol etmek, yürütme geçmişini izlemeyi ve yapılandırma sorunlarını açık ve hızlı bir şekilde bulmayı kolaylaştırır.

Geçici testler için Dockerfile'ı değiştirmekten kaçının

Hata ayıklamaya elverişli çalışma zamanı ENTRYPOINT geçersiz kılmaları, konteyner imajlarını tekrar tekrar değiştirip yeniden oluşturmadan sorunları izole edip düzeltmenize olanak tanır.

Optimizasyon Teknikleri ve En İyi Uygulamalar

Aşağıda, ENTRYPOINT güvenilirliğini ve sürdürülebilirliğini artırmak için önerilen birkaç optimizasyon yer alıyor.

Sinyal işleme için exec biçimini kullanın

Doğru sonlandırma sinyalleri ve genel konteyner güvenilirliği ile yönetimi için her zaman exec biçimini tercih edin.

ENTRYPOINT ve CMD'yi etkili bir şekilde birleştirin

Yürütülebilir dosyanızı (ENTRYPOINT) varsayılan çalışma zamanı argümanlarından (CMD) ayırın ve azami esneklik ile kolay yönetim için çalışma anı geçersiz kılmalarından yararlanın.

ENTRYPOINT'te karmaşıklığı en aza indirin

ENTRYPOINT'i basit tutun; karmaşık başlangıç mantığını veya koşulları ayrı betiklere devredin. Bu, karmaşıklığın doğru yönetilmesini ve açıklığın artmasını sağlar.

İleri Düzey Kullanım Alanları ve Kalıplar

Bazı gelişmiş ENTRYPOINT kullanım alanlarını ve kalıplarını inceleyelim.

ENTRYPOINT ile çok aşamalı derlemeler

Son Docker aşamalarında ENTRYPOINT, CI/CD iş akışları içinde üretim görevlerine özel olarak uyarlanmış, daha temiz ve güvenilir yürütme sağlar.

Dinamik ENTRYPOINT betikleri

ENTRYPOINT betikleri, sağlanan ortam değişkenlerine veya çalışma zamanı argümanlarına göre başlangıç mantığını dinamik olarak ayarlayabilir; farklı uygulama bağlamlarına sorunsuz şekilde uyum sağlar.

CI/CD boru hatları için ENTRYPOINT

ENTRYPOINT'ten yararlanmak, test ve üretim ortamları arasında tutarlılığı artırır; öngörülebilir çalışma zamanı davranışları ve tekrarlanabilirlik sağlar. Örneğin, testleri otomatik olarak çalıştıran bir betiği ENTRYPOINT olarak ayarlayabilirsiniz. 

Diğer uygulamalar şunları içerir: 

  • Veritabanını bekleyen, ardından migrasyonları çalıştıran ve son olarak app'i başlatan bir ENTRYPOINT.
  • Varlıkları derleyen, kodu lint eden veya yapılandırmaları otomatik olarak doğrulayan bir ENTRYPOINT.
  • ENTRYPOINT betikleri, ortamları (geliştirme, hazırlık, üretim) algılayabilir ve konteyner başlangıcında ayarları buna göre düzenleyebilir. 

İşte testleri otomatik olarak çalıştıran bir Docker imajı örneği:

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["pytest"]

.gitlab-ci.yml şu şekilde görünecektir:

build-test:
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t myapp-test .
    - docker run myapp-test  # <-- No need to specify 'pytest', ENTRYPOINT does it

docker run çalıştığında, konteyner içinde otomatik olarak pytest tetiklenir. Bu, tüm testlerin hemen bulunup çalıştırılmasını sağlar. 

CI/CD'de ENTRYPOINT kullanmanın birkaç avantajı vardır:

  • Her konteyner aynı şekilde başlar ve davranır. 
  • CI/CD betiklerini sadeleştirir; her seferinde tam komutları geçirmeniz gerekmez. 
  • Ön başlatma kontrollerini, test çalıştırmalarını ve migrasyonları otomatikleştirir; insan hatasını azaltır. 

Yaygın Tuzaklar ve Sorun Giderme

ENTRYPOINT, iş akışlarınızda kaçınmaya değer birkaç tuzak içerir.

Shell biçiminin yanlış kullanımı

Shell biçimi, sinyalleri ve konteyner yöneticilerini olumsuz etkiler; doğru sinyal işleme, konteyner çıkışları ve temiz durdurma için her zaman exec biçimini tercih edin.

ENTRYPOINT'i aşırı karmaşıklaştırma

Açıklık veya güvenilirlikten yoksun karmaşık betikler, hata ayıklama veya sürekli bakım sırasında daha da sorunlu hale gelir. Basit ENTRYPOINT kurulumları, sorun gidermeyi önemli ölçüde kolaylaştırır.

Sonuç

Docker ENTRYPOINT'i anlamak ve etkili şekilde uygulamak, uygulamalarınız için öngörülebilir, güvenilir ve sürdürülebilir Docker konteynerleri oluşturmanıza olanak tanır. Doğru kullanıldığında ENTRYPOINT, Docker'ın güçlü geçersiz kılma sistemi sayesinde esneklikten ödün vermeden tutarlılık sağlar. Yukarıda belirtilen en iyi uygulamalara uyarak ENTRYPOINT kalıplarını dikkatle denemek, Docker kullanımını önemli ölçüde sadeleştirir ve üretimde daha sorunsuz dağıtım ile yönetim döngülerine yol açar.

Daha fazla Docker konusunu keşfetmek için Docker kurslarımıza göz atın; örneğin:

Derrick Mwiti

Yazar

Derrick Mwiti

Docker ENTRYPOINT SSS

Bir Dockerfile’da ENTRYPOINT ile CMD arasındaki fark nedir?

ENTRYPOINT, konteyner başlatıldığında her zaman çalışan ana komutu tanımlar. CMD, bu komut için varsayılan argümanlar sağlar. Her ikisi de kullanılırsa, çalışma anında geçersiz kılınmadıkça CMD değerleri ENTRYPOINT'e aktarılır.

ENTRYPOINT’in exec biçimini mi, shell biçimini mi ne zaman kullanmalıyım?

Doğru sinyal işleme ve doğrudan PID 1 yürütmesi istediğinizde exec biçimini (örn., ["app", "arg1"]) kullanın. Shell biçimi (örn., "app arg1"), bir kabuk başlattığı ve sinyalleri doğru iletmeyebileceği için sınırlıdır; bu da üretim kullanımı için daha az güvenilir kılar.

Dockerfile’ı değiştirmeden ENTRYPOINT’i çalışma anında geçersiz kılabilir miyim?

Evet, Dockerfile’ı değiştirmeden --entrypoint bayrağını docker run ile kullanarak ENTRYPOINT’i çalışma anında geçersiz kılabilirsiniz. Bu, hata ayıklama veya geçici olarak alternatif komutlar çalıştırmak için kullanışlıdır.

ENTRYPOINT kullanırken bazı konteynerlerin düzgün durmamasının nedeni nedir?

Bu durum çoğunlukla ENTRYPOINT’in shell biçimi kullanıldığında ortaya çıkar; aradaki kabuk nedeniyle ana sürece sinyaller düzgün iletilemez. Bu sorundan kaçınmak için exec biçimini kullanın.

ENTRYPOINT betiğine çok fazla mantık eklemek kötü bir uygulama mı?

Evet. ENTRYPOINT betiklerini minimal tutmak en iyi uygulamadır. Karmaşık mantığı ayrı betiklere veya başlatma yardımcılarına devredin. Bu, sürdürülebilirliği artırır ve hata ayıklama zorluklarını azaltır.

Konular

İlgili