J'ai un conteneur docker exécutant 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 ne sont pas connus avant (elles sont dynamiques). Je veux que mon nginx.conf
utilise ces valeurs - par exemple
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Comment puis-je obtenir des variables d'environnement dans la configuration de Nginx au démarrage?
EDIT 1
Voici l'intégralité du fichier, après la réponse suggérée ci-dessous :
env APP_WEB_1_PORT_5000_TCP_ADDR;
# Configuration hôte Nginx pour l'application django_app
# L'application Django est servie par Gunicorn, fonctionnant sous le 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 produit une erreur :
$ nginx -s reload
nginx: [emerg] directive inconnue "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
Nginx.conf racine :
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
# L'application Django est servie par Gunicorn, fonctionnant sous le port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
Recharger la configuration nginx :
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
11 votes
Ce n'est pas une solution générique pour les variables d'environnement, mais si vous souhaitez utiliser des variables d'environnement pour les noms d'hôtes / adresses IP des serveurs en amont, notez que Docker (du moins dans les versions récentes) modifie /etc/hosts pour vous. Voir docs.docker.com/userguide/dockerlinks Cela signifie que si votre conteneur lié s'appelle 'app_web_1', Docker créera une ligne dans /etc/hosts de votre conteneur Nginx. Vous pouvez donc simplement remplacer
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
parserver app_web_1:5000;
1 votes
Merci @mozz100 - c'est incroyablement utile - les entrées /etc/hosts sont beaucoup plus efficaces que les variables d'environnement dans ce cas. La seule chose qui manque, c'est ce qui se passe si le conteneur amont est redémarré et acquiert une nouvelle adresse IP. Je suppose que les conteneurs enfants pointeront toujours vers l'adresse IP d'origine, pas la nouvelle ?
1 votes
Oui, si vous redémarriez
app_web_1
, il recevrait une nouvelle adresse IP, vous devriez donc redémarrer votre conteneur nginx aussi. Docker le redémarrerait avec un/etc/hosts
mis à jour, vous n'auriez donc pas besoin de modifier le(s) fichier(s) de configuration nginx.0 votes
En lisant les réponses ici, je suis estomaqué que quelque chose d'aussi basique n'ait pas été élégamment mis en œuvre par probablement le serveur web le plus populaire de la planète.