将环境变量从Docker传递到Nginx配置文件不起作用

时间:2019-07-25 10:40:50

标签: docker nginx docker-compose nginx-reverse-proxy nginx-config

我真的很沮丧,可以使用帮助弄清楚为什么我的环境变量没有从Docker传输到nginx配置文件。

我有一个docker-compose.yml

nginx:
    image: nginx
    container_name: proxier
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - ./conf/server.nginx.conf.tpl:/etc/nginx/server.nginx.conf.tpl
      - ./build/web:/srv/static:ro
      - ./docker/proxier:/tmp/docker
    ports:
      - "80:80"
      - "443:443"
    environment:
      - HOST_EXTERNAL_IP=localhost
      - DEVSERVER_PORT=8000
      - DEVSERVICE_PORT=5000
    command: /bin/bash -c "env && envsubst '$$HOST_EXTERNAL_IP $$DEVSERVER_PORT $$DEVSERVICE_PORT' < /etc/nginx/server.nginx.conf.tpl > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

我有一个nginx.conf文件

user  nginx;
worker_processes  1;

error_log  /dev/stdout warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;


http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  client_max_body_size 100g;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /dev/stdout  main;

  sendfile        off;
  tcp_nopush     on;

  keepalive_timeout  65;

  gzip on;

  server_tokens off;

  upstream app {
    server myapp:8000 fail_timeout=0;
  }
  include /etc/nginx/server.nginx.conf.tpl;
}

我有一个server.nginx.conf.tpl文件

server {

  listen 80;
  listen 443 ssl http2 default_server;
  server_name localhost;

  index index.html;

  location ^~ /services/ {
      proxy_pass       https://myurl.com;
      proxy_set_header USER_DN $ssl_client_s_dn;
      proxy_set_header Host      $host;
      proxy_set_header X-Real-IP $remote_addr;
  }

  location / {
      proxy_http_version  1.1;
      proxy_set_header    Connection "keep-alive";
      proxy_pass       http://${HOST_EXTERNAL_IP}:${DEVSERVER_PORT}; # Won't read environment variables here
  }
 }

但是当我运行它时,我得到了错误

nginx: [emerg] unknown "host_external_ip" variable我正在正确使用envsubst来按照docs

从docker传递环境变量。

1 个答案:

答案 0 :(得分:0)

请勿直接复制nginx.conf。而是创建一个shell文件来生成nginx文件,例如

echo 'you nginx conf goes here with $envVariable' > location/to/conf/folder/nginx.conf

并在容器中运行该文件。因此,该外壳文件将在何时运行。它将用nginx.conf中的实际值替换您设置的环境变量。 不要忘记跳过$的nginx变量。