[ Rédigé à la baisse et édité à partir de https://stackoverflow.com/questions/21933955 car il a été jugé trop sysadmin-like pour StackOverflow.]
J'ai un conteneur Docker sous Nginx, qui est lié à un autre conteneur Docker. Le nom d'hôte et l'adresse IP du deuxième conteneur sont chargés dans le conteneur Nginx en tant que variables d'environnement au démarrage, mais ils ne sont pas connus auparavant (dynamique). Je veux que nginx.conf
j'utilise ces valeurs - par exemple
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Comment obtenir des variables d'environnement dans la configuration de Nginx au démarrage?
EDIT 1
Ceci est le fichier entier, après la réponse suggérée ci-dessous:
env APP_WEB_1_PORT_5000_TCP_ADDR;
# Nginx host configuration for django_app
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_pass http://gunicorn;
}
}
Le rechargement de nginx alors des erreurs:
$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1
EDIT 2: plus de détails
Variables d'environnement actuelles
root@87ede56e0b11:/# env | grep APP_WEB_1
APP_WEB_1_NAME=/furious_turing/app_web_1
APP_WEB_1_PORT=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP=tcp://172.17.0.63:5000
APP_WEB_1_PORT_5000_TCP_PROTO=tcp
APP_WEB_1_PORT_5000_TCP_PORT=5000
APP_WEB_1_PORT_5000_TCP_ADDR=172.17.0.63
Racine nginx.conf:
root@87ede56e0b11:/# head /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /var/run/nginx.pid;
env APP_WEB_1_PORT_5000_TCP_ADDR;
Configuration du site nginx:
root@87ede56e0b11:/# head /etc/nginx/sites-available/default
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
Rechargez la configuration de nginx:
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
app_web_1
, une nouvelle adresse IP sera obtenue. Vous devrez donc également redémarrer votre conteneur nginx. Docker le relancerait avec une mise à jour /etc/hosts
afin que vous n'ayez pas besoin de modifier le (s) fichier (s) de configuration de nginx.
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
parserver app_web_1:5000;