0Pricing
Linux Command Line & Bash Scripting Mastery · Ders

envsubst ve heredoc'larla Yapılandırma Şablonlama

envsubst ve tırnak içine alınmış heredoc'ları kullanarak ortam değişkenlerinden çalışma zamanı yapılandırması oluşturun.

envsubst ve heredoc'larla Yapılandırma Şablonlama, CoddyKit'te ücretsiz bir Linux Command Line & Bash Scripting Mastery dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Linux Command Line & Bash Scripting Mastery öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.

Çalışma Zamanı Yapılandırmasına Şablon Uygulamak Neden Önemlidir

DevOps ve kapsayıcı iş akışlarında nginx.conf, prometheus.yml ve docker-compose.yml gibi yapılandırma dosyalarının ortamlar arasında — hazırlık, üretim ve DR — değişmesi gerekebilir. Değerleri sabit kodlamak, sapmalara ve gizli bilgilerin açığa çıkmasına neden olur.

Çözüm çalışma zamanı yapılandırmasına şablon uygulamaktır: yer tutucular içeren bir şablon gönderin, ardından başlangıçta gerçek değerleri ortam değişkenlerinden ekleyin. Bu yaklaşım imajınızı değişmez, yapılandırmanızı da denetlenebilir tutar.

  • İmajların içine gömülmüş gizli bilgi bulunmaz
  • Aynı yapıt ortamlar arasında ilerletilir
  • Yapılandırma süreç başlamadan hemen önce oluşturulur

Bash'te bunu kolaylaştıran iki tamamlayıcı araç vardır: envsubst ve alıntılanmış heredoc'lar.

envsubst: Tek Satırlık Yapılandırma Oluşturucu

envsubst, standart girdiyi okuyan, $VARIABLE ve ${VARIABLE} yer tutucularını mevcut ortamdaki değerleriyle değiştiren ve sonucu standart çıktıya yazan küçük bir GNU yardımcı programıdır.

gettext paketiyle birlikte gelir ve neredeyse tüm Linux dağıtımlarında ve Docker temel imajlarında bulunur.

  • Her metin biçimiyle çalışır: NGINX, YAML, TOML, JSON, INI
  • Kabuk söz dizimini değerlendirmez; yalnızca değişken başvurularını değiştirir
  • Güvenlidir: şablonun içindeki komutları çalıştırmaz
#!/usr/bin/env bash
# Install check (usually already present)
which envsubst || apt-get install -y gettext-base

# Minimal demo
export APP_PORT=8080
export APP_HOST=api.example.com

echo 'server { listen ${APP_PORT}; server_name ${APP_HOST}; }' | envsubst
# Output: server { listen 8080; server_name api.example.com; }

Seçmeli Değişken Değiştirme

Varsayılan olarak envsubst, bulduğu her $VAR ifadesini değiştirir. Bu durum $uri veya $host gibi NGINX değişkenlerini bozabilir; bunlar ortam değişkenleriniz değil, gerçek NGINX yönergeleridir.

Değiştirmeyi yalnızca istediğiniz adlarla sınırlamak için ilk bağımsız değişken olarak açık bir değişken listesi geçirin:

envsubst '$VAR1 $VAR2'

Bağımsız değişken, kabuğun genişletme yapmaması için tek tırnak içine alınmış bir dizedir; değiştirilmesini istediğiniz değişken adlarını boşluklarla veya satır sonlarıyla ayrılmış biçimde içerir.

#!/usr/bin/env bash
export APP_PORT=8080
export APP_HOST=api.example.com

# NGINX template contains both our vars AND nginx vars ($uri, $host)
TEMPLATE='server {
  listen ${APP_PORT};
  server_name ${APP_HOST};
  location / {
    proxy_set_header Host $host;
    proxy_pass http://backend$uri;
  }
}'

# Only substitute APP_PORT and APP_HOST — leave $host and $uri untouched
echo "$TEMPLATE" | envsubst '${APP_PORT} ${APP_HOST}'

Diskteki Şablon Dosyaları

Gerçek yapılandırmalar için şablonu Dockerfile'ın yanında bir dosya olarak (ör. nginx.conf.template) saklayın. Kapsayıcı başlarken arka plan hizmetini başlatmadan önce envsubst çalıştırarak son yapılandırma dosyasını oluşturun.

Bu, resmi NGINX Docker imajının kullandığı temel kalıptır.

#!/usr/bin/env bash
# File: nginx.conf.template
# (In practice this lives on disk; we write it here for demo purposes)
cat > /tmp/nginx.conf.template << 'TMPL'
server {
    listen ${NGINX_PORT};
    server_name ${SERVER_NAME};
    root /var/www/${APP_ENV};

    location / {
        proxy_pass http://app:${APP_PORT};
    }
}
TMPL

export NGINX_PORT=80
export SERVER_NAME=myapp.example.com
export APP_ENV=production
export APP_PORT=3000

# Generate final config
envsubst '${NGINX_PORT} ${SERVER_NAME} ${APP_ENV} ${APP_PORT}' \
  < /tmp/nginx.conf.template \
  > /tmp/nginx.conf

cat /tmp/nginx.conf

Tırnaklı Çok Satırlı Metin Blokları: Geçici Dosya Olmadan Satır İçi Şablonlar

Bir tırnaklı çok satırlı metin bloğu (sınırlayıcının tek tırnakla çevrelendiği << 'EOF' kullanımı), kabuğun blok içindeki değişkenleri genişletmesini veya komut ikamelerini çalıştırmasını engeller. İçerik, değişmez bir dize olarak ele alınır.

Bu, çok satırlı metin bloklarını satır içinde şablon yazmanın ve doğrudan envsubst aracına yönlendirmenin mükemmel yolu yapar — arada bir dosya gerekmez.

  • << EOF (tırnaksız) — kabuk $VAR ifadesini hemen genişletir
  • << 'EOF' (tırnaklı) — içerik değişmezdir; genişletme envsubst aracına ertelenir
#!/usr/bin/env bash
export DB_HOST=postgres.internal
export DB_PORT=5432
export DB_NAME=myapp_prod

# Quoted heredoc: shell does NOT expand $DB_HOST etc. yet
envsubst << 'EOF'
[database]
host     = ${DB_HOST}
port     = ${DB_PORT}
dbname   = ${DB_NAME}
EOF
# Output uses actual env var values — expansion done by envsubst, not the shell

Çok Satırlı Metin Bloklarını Çıktı Yönlendirmeyle Birleştirme

Tırnaklı bir çok satırlı metni envsubst aracından geçirip sonucu tek bir ifadeyle bir dosyaya yönlendirin. Bu, bir giriş noktası betiğinde yapılandırma dosyaları oluşturmak için en temiz kullanımdır.

Hedef biçimin (Prometheus, NGINX vb.) korumanız gereken kendi $variable söz dizimi olduğunda seçmeli değiştirmeyi ('${VAR1} ${VAR2}') kullanın.

#!/usr/bin/env bash
# entrypoint.sh — Docker container entrypoint
set -euo pipefail

export PROM_PORT=${PROM_PORT:-9090}
export SCRAPE_INTERVAL=${SCRAPE_INTERVAL:-15s}
export TARGET_HOST=${TARGET_HOST:-localhost:8080}

envsubst '${PROM_PORT} ${SCRAPE_INTERVAL} ${TARGET_HOST}' << 'EOF' > /etc/prometheus/prometheus.yml
global:
  scrape_interval: ${SCRAPE_INTERVAL}
  evaluation_interval: ${SCRAPE_INTERVAL}

scrape_configs:
  - job_name: 'app'
    static_configs:
      - targets: ['${TARGET_HOST}']

EOF

echo "[entrypoint] Prometheus config written on port ${PROM_PORT}"
exec prometheus --config.file=/etc/prometheus/prometheus.yml --web.listen-address=":${PROM_PORT}"

Değiştirme Öncesi Varsayılan Değerler ve Doğrulama

Gerekli tüm değişkenlerin ayarlandığına asla güvenmeyin. Varsayılan değerler sağlamak veya işlemi belirgin bir hatayla durdurmak için Bash parametre genişletmesini kullanın:

  • ${VAR:-default} — VAR ayarlanmamışsa veya boşsa default değerini kullanır
  • ${VAR:?error message} — VAR ayarlanmamışsa veya boşsa bir hatayla durur

Şablonun her zaman somut bir değer alması veya betiğin yararlı bir iletiyle erkenden durması için bunları envsubst çağrısından önce ayarlayın.

#!/usr/bin/env bash
set -euo pipefail

# Required — abort if missing
: "${DATABASE_URL:?DATABASE_URL must be set}"
: "${SECRET_KEY:?SECRET_KEY must be set}"

# Optional with defaults
export APP_PORT=${APP_PORT:-8000}
export LOG_LEVEL=${LOG_LEVEL:-info}
export WORKERS=${WORKERS:-4}

envsubst '${DATABASE_URL} ${SECRET_KEY} ${APP_PORT} ${LOG_LEVEL} ${WORKERS}' \
  < /app/config/app.conf.template \
  > /app/config/app.conf

echo "[init] Config generated — port=${APP_PORT} workers=${WORKERS} log=${LOG_LEVEL}"

Birden Fazla Çok Satırlı Metin Bloğuyla Bölümlere Ayrılmış Yapılandırmalar Oluşturma

Mantıksal bölümlerden oluşan karmaşık yapılandırmalarda her bölümü bağımsız olarak oluşturup birleştirebilir veya tüm dosyayı kapsayan tek bir çok satırlı metin bloğu kullanabilirsiniz. Her iki yaklaşım da işe yarar; seçiminizi okunabilirliğe göre yapın.

Bölümler koşula bağlı olarak dahil ediliyorsa (örneğin sertifika yolu ayarlanmışsa yalnızca TLS bloğunun eklenmesi), if bloklarıyla birlikte birden çok çok satırlı metin bloğu kullanmak daha temizdir.

#!/usr/bin/env bash
set -euo pipefail

export APP_HOST=${APP_HOST:-localhost}
export APP_PORT=${APP_PORT:-8080}
export TLS_CERT=${TLS_CERT:-}
export TLS_KEY=${TLS_KEY:-}

CONFIG_FILE=/tmp/app.conf

# Base section
envsubst '${APP_HOST} ${APP_PORT}' << 'BASE' > "$CONFIG_FILE"
[server]
host = ${APP_HOST}
port = ${APP_PORT}
BASE

# Conditional TLS section — only appended when cert is provided
if [[ -n "$TLS_CERT" && -n "$TLS_KEY" ]]; then
  envsubst '${TLS_CERT} ${TLS_KEY}' << 'TLS' >> "$CONFIG_FILE"

[tls]
cert_file = ${TLS_CERT}
key_file  = ${TLS_KEY}
TLS
  echo "[init] TLS enabled"
else
  echo "[init] TLS disabled (no cert/key provided)"
fi

cat "$CONFIG_FILE"

Docker Giriş Noktası Düzeni

Önerilen Docker giriş noktası düzeninde, başlangıçta yapılandırmaları oluşturmak için bir kabuk betiği (docker-entrypoint.sh) kullanılır, ardından ana işlem exec ile devredilir. exec kullanmak kabuk işlemini artalan hizmetiyle değiştirir; böylece sinyaller (SIGTERM, SIGINT) doğrudan artalan hizmetine ulaşır. Bu, düzgün kapanma için kritik önemdedir.

Şablon dosyaları derleme zamanında imaja eklenir; değerler çalışma zamanında docker run -e veya Kubernetes env: / envFrom: aracılığıyla enjekte edilir.

#!/usr/bin/env bash
# docker-entrypoint.sh
set -euo pipefail

# Validate required env vars
for var in DATABASE_URL REDIS_URL SECRET_KEY; do
  : "${!var:?$var is required}"
done

export APP_PORT=${APP_PORT:-8000}
export WORKERS=${WORKERS:-$(nproc)}

echo "[entrypoint] Generating configuration..."
envsubst '${DATABASE_URL} ${REDIS_URL} ${SECRET_KEY} ${APP_PORT} ${WORKERS}' \
  < /app/config/settings.toml.template \
  > /app/config/settings.toml

echo "[entrypoint] Starting server on port ${APP_PORT} with ${WORKERS} workers"
exec gunicorn app:application \
  --bind "0.0.0.0:${APP_PORT}" \
  --workers "${WORKERS}"

Kubernetes ConfigMap + envsubst Düzeni

Kubernetes'te ortam değişkenleri, Pod belirtimindeki env: veya envFrom: aracılığıyla enjekte edilir. Konteynerinizin giriş noktası, işlem başlamadan önce yapılandırmaları gerçek değerlerle oluşturmak için envsubst çağırır; her ortam için ayrı bir ConfigMap gerekmez.

Bu yaklaşım, ortama özgü değerleri Kubernetes Gizli Bilgileri ve ConfigMaps içinde (hassas olmayan veriler için) tutarken yapılandırma şablonunu imajda barındırır. Tek imaj, birçok ortam.

  • Derleme: COPY nginx.conf.template /etc/nginx/templates/
  • Çalışma zamanı: giriş noktası envsubst aracını çalıştırır ve /etc/nginx/nginx.conf dosyasını yazar
  • Kubernetes şunları enjekte eder: bir Gizli Bilgi veya ConfigMap'ten APP_PORT, BACKEND_HOST

envsubst Hatalarını Ayıklama: Eksik veya Çözümlenmemiş Değişkenleri Bulma

Oluşturulan bir yapılandırmada değer yerine gerçek ${VAR} ifadesi varsa değişken dışa aktarılmamış veya değiştirme listesine dahil edilmemiştir. Hatanın kaynağını bulmak için şu teknikleri kullanın:

  • printenv | sort — dışa aktarılmış tüm değişkenleri listeler
  • Şablondaki yer tutucuları grep kullanarak dışa aktarılmış değişkenlerle karşılaştırın
  • envsubst aracını çalıştırın ve çıktıda kalan ${ örüntülerini grep ile arayın
  • Çağıran betikte set -u kullanın; böylece Bash kodundaki ayarlanmamış değişken başvuruları işlemi hemen durdurur
#!/usr/bin/env bash
set -euo pipefail

TEMPLATE=/tmp/app.conf.template
OUTPUT=/tmp/app.conf

# Write a demo template
cat > "$TEMPLATE" << 'EOF'
host=${DB_HOST}
port=${DB_PORT}
name=${DB_NAME}
EOF

export DB_HOST=db.internal
export DB_PORT=5432
# DB_NAME intentionally left unset

envsubst < "$TEMPLATE" > "$OUTPUT"

# Detect unresolved placeholders
if grep -qE '\$\{[A-Z_]+\}' "$OUTPUT"; then
  echo "ERROR: unresolved placeholders found:"
  grep -oE '\$\{[A-Z_]+\}' "$OUTPUT" | sort -u
  exit 1
fi

echo "Config OK:"
cat "$OUTPUT"

Bilgi Kontrolü: envsubst ile Seçmeli Değiştirme

Hem uygulama değişkeniniz ${APP_PORT} hem de yerel NGINX değişkeni $uri bulunan bir NGINX yapılandırma şablonunu düşünün. Aşağıdaki komutu çalıştırıyorsunuz:

envsubst < nginx.conf.template > nginx.conf

Sonuç nedir?

Ders Özeti: envsubst ve Çok Satırlı Metin Bloklarıyla Yapılandırma Şablonlama

Artık Bash'te çalışma zamanında yapılandırma oluşturmak için üretim kalitesinde bir araç setine sahipsiniz:

  • envsubst, geçerli ortamı kullanarak herhangi bir metin dosyasındaki ${VAR} yer tutucularını değiştirir — betik yazmaya veya özel kaçış işlemlerine gerek yoktur
  • Seçmeli değiştirme (envsubst '${VAR1} ${VAR2}'), NGINX, Prometheus ve benzeri araçlardaki yerel değişkenlerin yanlışlıkla değiştirilmesini önler
  • Tırnaklı çok satırlı metin blokları (<< 'EOF'), kabuk genişletmesini erteler; böylece şablon içeriği envsubst aracına bozulmadan ulaşır — geçici dosya gerekmez
  • Değiştirmeden önce doğrulayın: gerekli değişkenler eksikse durmak için ${VAR:?message}, isteğe bağlı değişkenler için ${VAR:-default} kullanın
  • Docker giriş noktası düzeni: yapılandırmaları konteyner başlatılırken oluşturun, ardından sinyallerin doğru işlenmesi için artalan hizmetini exec ile çalıştırın
  • Çözümlenmemiş yer tutucuları ayıklayın: işlem başlamadan önce çıktıda kalan ${ örüntülerini grep ile arayın

Bu düzenler konteyner imajlarınızı değişmez tutar, gizli bilgilerinizi sürüm denetiminin dışında bırakır ve yapılandırmalarınızı her ortamda tutarlı kılar.

Sıkça Sorulan Sorular

“envsubst ve heredoc'larla Yapılandırma Şablonlama” dersi ücretsiz mi?

Evet — “envsubst ve heredoc'larla Yapılandırma Şablonlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Linux Command Line & Bash Scripting Mastery kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Command Line & Bash Scripting Mastery kursu toplamda 4 dersten oluşur.

“envsubst ve heredoc'larla Yapılandırma Şablonlama” dersinde ne öğreneceğim?

envsubst ve tırnak içine alınmış heredoc'ları kullanarak ortam değişkenlerinden çalışma zamanı yapılandırması oluşturun. Linux Command Line & Bash Scripting Mastery ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Linux Command Line & Bash Scripting Mastery öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Linux Command Line & Bash Scripting Mastery, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“envsubst ve heredoc'larla Yapılandırma Şablonlama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Linux Command Line & Bash Scripting Mastery dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Linux Command Line & Bash Scripting Mastery dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yalın Dockerfile'lar ve Kabuk Giriş Noktaları Yazma
  2. envsubst ve heredoc'larla Yapılandırma Şablonlama
  3. CLI ve jq ile Bulut Kaynaklarını Betikleme
  4. Sağlık Yoklamaları, Hazırlık Kapıları ve Bekleme Döngüleri
← Linux Command Line & Bash Scripting Mastery Sayfasına Dön