[Cross-posted und bearbeitet von https://stackoverflow.com/questions/21933955, da dies für StackOverflow als zu sysadmin-artig angesehen wurde.]
Ich habe einen Docker-Container mit Nginx, der mit einem anderen Docker-Container verknüpft ist. Der Hostname und die IP-Adresse des zweiten Containers werden beim Start als Umgebungsvariablen in den Nginx-Container geladen, sind aber bis dahin nicht bekannt (dynamisch). Ich möchte, dass ich nginx.conf
diese Werte verwende - z
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Wie kann ich beim Start Umgebungsvariablen in die Nginx-Konfiguration übernehmen?
EDIT 1
Dies ist die gesamte Datei nach der vorgeschlagenen Antwort unten:
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;
}
}
Nginx neu laden, dann Fehler:
$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1
EDIT 2: Weitere Details
Aktuelle Umgebungsvariablen
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
Root 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;
Site nginx Konfiguration:
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;
Nginx-Konfiguration neu laden:
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
app_web_1
, wird eine neue IP-Adresse zugewiesen, sodass Sie auch Ihren Nginx-Container neu starten müssen. Docker würde es mit einer aktualisierten Version neu starten, /etc/hosts
sodass Sie die nginx-Konfigurationsdatei (en) nicht ändern müssen.
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
mitserver app_web_1:5000;