Î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.
# 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:
# 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 "$@"