Generarea Dinamică a Fișierelor de Configurație cu envsubst în Linux / Bash

Scripting Bash Pachetul gettext-base

Ghid complet pentru comanda envsubst în Linux și Docker: injectarea dinamică a variabilelor de mediu în șabloane de configurare Nginx, Apache și fișiere YAML.

Sintaxă comandă
envsubst < template.conf > output.conf | envsubst '$DOMENIU $PORT' < in.conf > out.conf

În arhitecturile moderne bazate pe containere Docker, Kubernetes și pipeline-uri CI/CD, fișierele de configurare statice (cum ar fi nginx.conf, application.yml sau configurații de proxy) trebuie generate dinamic pe baza variabilelor de mediu (Environment Variables) configurate în container. Comanda envsubst (inclusă în pachetul standard gettext-base) este utilitarul cel mai rapid și ușor pentru substituirea variabilelor în fișiere șablon.

1. Exemplu practic: Generarea dinamică a configurării Nginx
# Fișierul șablon: /etc/nginx/templates/site.conf.template
server {
    listen 80;
    server_name ${DOMENIU_PUBLIC};

    location / {
        proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
        proxy_set_header Host $host;
    }
}

# Comanda de generare:
export DOMENIU_PUBLIC="api.dexblog.ro"
export BACKEND_HOST="10.0.1.20"
export BACKEND_PORT="8080"

# Rulăm envsubst:
envsubst < /etc/nginx/templates/site.conf.template > /etc/nginx/conf.d/site.conf

Capcana Majoră cu Nginx și Soluția: Filtrarea Variabilelor

Dacă rulați envsubst < template > output simplu pe un fișier de Nginx, utilitarul va încerca să înlocuiască toate variabilele care încep cu simbolul dolar, inclusiv variabilele native de Nginx precum $host, $uri sau $remote_addr (care nu sunt definite în shell și vor fi șterse, rezultând un fișier corupt!).

Soluția de Aur: Transmiteți ca argument către envsubst lista exactă a variabilelor care au voie să fie substituite:

Substituire selectivă pentru a proteja variabilele Nginx
# Doar variabilele $DOMENIU_PUBLIC, $BACKEND_HOST și $BACKEND_PORT vor fi înlocuite.
# Variabilele native $host și $uri vor rămâne INTACTE în fișierul generat!
envsubst '$DOMENIU_PUBLIC $BACKEND_HOST $BACKEND_PORT' \
    < /etc/nginx/templates/site.conf.template \
    > /etc/nginx/conf.d/site.conf

Utilizare în Scripturi de Entrypoint Docker

Această tehnică este standardul oficial folosit în containerele Docker:

#!/bin/sh
# /docker-entrypoint.sh
set -e

# Înlocuim variabilele la pornirea containerului:
envsubst '$API_URL $ENVIRONMENT' < /app/config.json.template > /app/config.json

# Lansăm procesul principal:
exec "$@"