[Postado e editado em https://stackoverflow.com/questions/21933955 , pois foi considerado muito semelhante ao sysadmin para o StackOverflow.]
Eu tenho um contêiner de docker executando o Nginx, vinculado a outro contêiner de docker. O nome do host e o endereço IP do segundo contêiner são carregados no contêiner Nginx como variáveis de ambiente na inicialização, mas não são conhecidos antes (é dinâmico). Eu quero que eu nginx.conf
use esses valores - por exemplo,
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Como posso obter variáveis de ambiente na configuração do Nginx na inicialização?
EDIT 1
Este é o arquivo inteiro, após a resposta sugerida abaixo:
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;
}
}
Recarregando nginx e erros:
$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1
EDIT 2: mais detalhes
Variáveis de ambiente atuais
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;
Configuração do 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;
Recarregue a configuração do nginx:
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
app_web_1
, obterá um novo endereço IP, portanto, você também precisará reiniciar o contêiner nginx. O Docker reinicia-o com uma atualização, /etc/hosts
para que você não precise alterar o (s) arquivo (s) de configuração do nginx.
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
porserver app_web_1:5000;