{"id":615,"date":"2026-10-02T12:00:00","date_gmt":"2026-10-02T12:00:00","guid":{"rendered":"https:\/\/konteynerium.com\/index.php\/2026\/10\/02\/compose-healthcheck-depends-on-ve-env-dosyalari\/"},"modified":"2026-10-02T12:00:00","modified_gmt":"2026-10-02T12:00:00","slug":"compose-healthcheck-depends-on-ve-env-dosyalari","status":"publish","type":"post","link":"https:\/\/konteynerium.com\/index.php\/2026\/10\/02\/compose-healthcheck-depends-on-ve-env-dosyalari\/","title":{"rendered":"Docker Compose&#8217;ta Healthcheck, depends_on ve .env: Do\u011fru S\u0131rada Ba\u015flatma"},"content":{"rendered":"<p>Klasik bir Compose hatas\u0131: web uygulamas\u0131 ba\u015flar, ama veritaban\u0131 hen\u00fcz ba\u011flant\u0131 kabul etmedi\u011fi i\u00e7in \u00e7\u00f6ker. <code>depends_on<\/code> kullan\u0131yorsunuz, yine de oluyor \u2014 \u00e7\u00fcnk\u00fc varsay\u0131lan <code>depends_on<\/code> yaln\u0131zca <em>ba\u015flatma s\u0131ras\u0131n\u0131<\/em> belirler, servisin <em>haz\u0131r<\/em> olmas\u0131n\u0131 beklemez. Bu yaz\u0131da <code>healthcheck<\/code>, <code>depends_on<\/code> ko\u015fullar\u0131 ve <code>.env<\/code> de\u011fi\u015fkenleriyle bunu do\u011fru kurmay\u0131 g\u00f6r\u00fcyoruz.<\/p>\n<h2>Sorun: &#8220;\u00e7al\u0131\u015f\u0131yor&#8221; ile &#8220;haz\u0131r&#8221; ayn\u0131 \u015fey de\u011fil<\/h2>\n<p>Bir veritaban\u0131 container&#8217;\u0131 saniyeler i\u00e7inde &#8220;running&#8221; olur ama veriyi y\u00fckleyip ba\u011flant\u0131 kabul etmeye ba\u015flamas\u0131 on-yirmi saniye s\u00fcrebilir. Compose&#8217;un resmi dok\u00fcmantasyonu da bunu a\u00e7\u0131k\u00e7a vurgular: <code>depends_on<\/code> yaln\u0131zca servislerin ba\u015flama s\u0131ras\u0131n\u0131 kontrol eder, servisin ger\u00e7ekten haz\u0131r oldu\u011funu garanti etmez. \u00c7\u00f6z\u00fcm iki par\u00e7al\u0131d\u0131r: servise bir <strong>healthcheck<\/strong> tan\u0131mlamak ve di\u011fer servisin bunu <code>condition: service_healthy<\/code> ile beklemesini sa\u011flamak.<\/p>\n<h2>Healthcheck tan\u0131mlamak<\/h2>\n<pre><code>db:\n  image: postgres:18\n  healthcheck:\n    test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER}\"]\n    interval: 10s\n    timeout: 10s\n    retries: 5\n    start_period: 30s<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th>Alan<\/th>\n<th>Anlam\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>test<\/code><\/td>\n<td>\u00c7al\u0131\u015ft\u0131r\u0131lacak komut; \u00e7\u0131k\u0131\u015f kodu 0 = sa\u011fl\u0131kl\u0131. <code>CMD-SHELL<\/code> komutu bir kabukta \u00e7al\u0131\u015ft\u0131r\u0131r<\/td>\n<\/tr>\n<tr>\n<td><code>interval<\/code><\/td>\n<td>Kontroller aras\u0131 s\u00fcre<\/td>\n<\/tr>\n<tr>\n<td><code>timeout<\/code><\/td>\n<td>Bir kontrol\u00fcn tamamlanmas\u0131 i\u00e7in s\u00fcre s\u0131n\u0131r\u0131<\/td>\n<\/tr>\n<tr>\n<td><code>retries<\/code><\/td>\n<td>Ka\u00e7 ard\u0131\u015f\u0131k ba\u015far\u0131s\u0131zl\u0131ktan sonra &#8220;unhealthy&#8221; say\u0131laca\u011f\u0131<\/td>\n<\/tr>\n<tr>\n<td><code>start_period<\/code><\/td>\n<td>A\u00e7\u0131l\u0131\u015f s\u00fcresi \u2014 bu s\u00fcre boyunca ba\u015far\u0131s\u0131z kontroller &#8220;unhealthy&#8221; say\u0131lmaz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><code>depends_on<\/code> ko\u015fullar\u0131<\/h2>\n<table>\n<thead>\n<tr>\n<th>Ko\u015ful<\/th>\n<th>Ne zaman ba\u015flar?<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>service_started<\/code><\/td>\n<td>Ba\u011f\u0131ml\u0131 container \u00e7al\u0131\u015fmaya ba\u015flay\u0131nca (varsay\u0131lan davran\u0131\u015f)<\/td>\n<\/tr>\n<tr>\n<td><code>service_healthy<\/code><\/td>\n<td>Ba\u011f\u0131ml\u0131 servisin healthcheck&#8217;i ba\u015far\u0131l\u0131 olunca<\/td>\n<\/tr>\n<tr>\n<td><code>service_completed_successfully<\/code><\/td>\n<td>Ba\u011f\u0131ml\u0131 servis \u00e7\u0131k\u0131\u015f kodu 0 ile bitince \u2014 migrasyon gibi tek seferlik i\u015fler i\u00e7in<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>U\u00e7tan uca \u00f6rnek (denenmi\u015f)<\/h2>\n<p>A\u015fa\u011f\u0131daki Compose dosyas\u0131 ger\u00e7ek bir senaryoyu \u00f6zetler: veritaban\u0131 haz\u0131r olana kadar \u00f6nce migrasyon, sonra web uygulamas\u0131 beklesin. Denemede veritaban\u0131n\u0131, bir dosyan\u0131n olu\u015fmas\u0131n\u0131 bekleyen basit bir healthcheck&#8217;le taklit ettik; mant\u0131k bir PostgreSQL ile birebir ayn\u0131d\u0131r.<\/p>\n<pre><code>services:\n  web:\n    image: uygulama:1\n    depends_on:\n      db:\n        condition: service_healthy\n        restart: true\n      migrate:\n        condition: service_completed_successfully\n\n  migrate:\n    image: uygulama:1\n    command: [\".\/migrate.sh\"]\n    depends_on:\n      db:\n        condition: service_healthy\n\n  db:\n    image: postgres:18\n    environment:\n      DB_NAME: ${DB_NAME:?DB_NAME tanimli degil}\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n      interval: 2s\n      timeout: 3s\n      retries: 10\n      start_period: 3s<\/code><\/pre>\n<p><code>docker compose up -d<\/code> \u00e7\u0131kt\u0131s\u0131nda ba\u015flatma s\u0131ras\u0131 a\u00e7\u0131k\u00e7a g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code> Container proje-db-1       Started\n Container proje-db-1       Waiting\n Container proje-db-1       Healthy\n Container proje-migrate-1  Started\n Container proje-migrate-1  Exited\n Container proje-web-1      Started\n\n$ docker compose ps\nSERVICE   STATUS\ndb        Up 9 seconds (healthy)\nweb       Up 1 second<\/code><\/pre>\n<p>S\u0131ra beklendi\u011fi gibi: <code>db<\/code> sa\u011fl\u0131kl\u0131 olana kadar beklendi, ard\u0131ndan <code>migrate<\/code> \u00e7al\u0131\u015f\u0131p ba\u015far\u0131yla bitti, en son <code>web<\/code> ba\u015flad\u0131. <code>restart: true<\/code> ise veritaban\u0131 g\u00fcncellenip yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda <code>web<\/code>&#8216;in de yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar, b\u00f6ylece ba\u011flant\u0131lar tazelenir.<\/p>\n<h2><code>.env<\/code> dosyas\u0131 ve zorunlu de\u011fi\u015fkenler<\/h2>\n<p>Compose, \u00e7al\u0131\u015ft\u0131\u011f\u0131 dizindeki <code>.env<\/code> dosyas\u0131n\u0131 otomatik okur ve <code>${DEGISKEN}<\/code> yaz\u0131mlar\u0131n\u0131 doldurur. Varsay\u0131lan de\u011fer ve zorunluluk i\u00e7in iki kullan\u0131\u015fl\u0131 bi\u00e7im vard\u0131r:<\/p>\n<pre><code>${STARTUP_DELAY:-5}            # tan\u0131ml\u0131 de\u011filse 5 kullan\n${DB_NAME:?DB_NAME tanimli degil}   # tan\u0131ml\u0131 de\u011filse hata ver ve dur<\/code><\/pre>\n<p><code>.env<\/code> dosyas\u0131 yokken <code>docker compose config<\/code> \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda zorunlu de\u011fi\u015fken \u015fu hatay\u0131 verdi:<\/p>\n<pre><code>error while interpolating services.db.environment.DB_NAME:\nrequired variable DB_NAME is missing a value: DB_NAME tanimli degil<\/code><\/pre>\n<p>Bu davran\u0131\u015f, eksik yap\u0131land\u0131rmay\u0131 sessizce bo\u015f de\u011ferle \u00e7al\u0131\u015ft\u0131rmak yerine <em>ba\u015flamadan \u00f6nce<\/em> yakalaman\u0131z\u0131 sa\u011flar. <code>docker compose config<\/code> komutunu dosyay\u0131 \u00e7al\u0131\u015ft\u0131rmadan do\u011frulamak ve de\u011fi\u015fkenlerin doldurulmu\u015f halini g\u00f6rmek i\u00e7in de kullanabilirsiniz.<\/p>\n<div class=\"callout\">\n  <span class=\"glyph\">!<\/span><\/p>\n<p><code>.env<\/code> dosyas\u0131n\u0131 Git&#8217;e eklemeyin ve ger\u00e7ek parolalar\u0131 orada tutmay\u0131n; \u00fcretimde <a href=\"https:\/\/konteynerium.com\/index.php\/2026\/10\/03\/docker-secrets-gizli-bilgi-yonetimi-build-ve-runtime\/\">Compose secrets<\/a> kullan\u0131n. <code>.env<\/code>&#8216;yi <a href=\"https:\/\/konteynerium.com\/index.php\/2026\/09\/30\/dockerignore-ve-build-baglami-docker-build-neden-yavas\/\">.dockerignore<\/a> ile imaj\u0131n d\u0131\u015f\u0131nda tutmay\u0131 da unutmay\u0131n.<\/p>\n<\/div>\n<h2>H\u0131zl\u0131 kontrol listesi<\/h2>\n<ul>\n<li>Ba\u015fka servislerin ba\u011fland\u0131\u011f\u0131 her servisin (veritaban\u0131, kuyruk, \u00f6nbellek) bir healthcheck&#8217;i var m\u0131?<\/li>\n<li>Ba\u011f\u0131ml\u0131 servisler <code>condition: service_healthy<\/code> kullan\u0131yor mu?<\/li>\n<li>Migrasyon gibi tek seferlik i\u015fler <code>service_completed_successfully<\/code> ile s\u0131ralanm\u0131\u015f m\u0131?<\/li>\n<li>Zorunlu de\u011fi\u015fkenler <code>${DEGISKEN:?mesaj}<\/code> ile korunuyor mu?<\/li>\n<\/ul>\n<p>Compose&#8217;un temellerini hat\u0131rlamak i\u00e7in <a href=\"https:\/\/konteynerium.com\/index.php\/2026\/05\/08\/docker-compose-ile-coklu-servis-yonetimi\/\">Docker Compose ile \u00c7oklu Servis Y\u00f6netimi<\/a> yaz\u0131s\u0131na, tek makineden orkestrasyona ge\u00e7i\u015fi tart\u0131\u015fan <a href=\"https:\/\/konteynerium.com\/index.php\/karsilastirma\/docker-compose-vs-kubernetes-hangisini-secmelisiniz\/\">Docker Compose vs Kubernetes<\/a> kar\u015f\u0131la\u015ft\u0131rmas\u0131na g\u00f6z at\u0131n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker Compose&#8217;ta veritaban\u0131 haz\u0131r olmadan uygulama ba\u015flamas\u0131n: healthcheck, depends_on ko\u015fullar\u0131, tek seferlik migrasyon servisleri ve zorunlu .env de\u011fi\u015fkenleri u\u00e7tan uca denenmi\u015f \u00f6rneklerle.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"seviye":[8],"class_list":["post-615","post","type-post","status-publish","format-standard","hentry","category-docker-derinlemesine","seviye-orta"],"_links":{"self":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/comments?post=615"}],"version-history":[{"count":0,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/615\/revisions"}],"wp:attachment":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/media?parent=615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/categories?post=615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/tags?post=615"},{"taxonomy":"seviye","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/seviye?post=615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}