[Đăng chéo và chỉnh sửa từ https://stackoverflow.com/questions/21933955 vì nó được coi là quá giống sysadmin cho StackOverflow.]
Tôi có một container docker chạy Nginx, liên kết đến một container docker khác. Tên máy chủ và địa chỉ IP của vùng chứa thứ hai được tải vào vùng chứa Nginx dưới dạng các biến môi trường khi khởi động, nhưng sau đó không biết (đó là động). Tôi muốn tôi nginx.conf
sử dụng các giá trị này - vd
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Làm cách nào tôi có thể nhận các biến môi trường vào cấu hình Nginx khi khởi động?
CHỈNH SỬA 1
Đây là toàn bộ tập tin, sau câu trả lời được đề xuất dưới đây:
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;
}
}
Đang tải lại nginx thì bị lỗi:
$ nginx -s reload
nginx: [emerg] unknown directive "env" in /etc/nginx/sites-enabled/default:1
EDIT 2: biết thêm chi tiết
Biến môi trường hiện tại
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;
Cấu hình trang web 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;
Tải lại cấu hình nginx:
root@87ede56e0b11:/# nginx -s reload
nginx: [emerg] directive "server" is not terminated by ";" in /etc/nginx/sites-enabled/default:3
app_web_1
nó sẽ nhận được một địa chỉ IP mới, vì vậy bạn cũng cần phải khởi động lại bộ chứa nginx của mình. Docker sẽ khởi động lại nó với một bản cập nhật, /etc/hosts
do đó bạn không cần phải thay đổi (các) tệp cấu hình nginx.
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
bằngserver app_web_1:5000;