docker中nginx的dynamicdefault.conf

这是我的default.conf我用我的Dockerfile中的下面一个replace原来的default.conf

 server { listen 80; server_name $servername; return 301 https://$server_name$request_uri; } server { listen 443; server_name $servername; ssl_certificate /etc/ssl/private/server.crt; ssl_certificate_key /etc/ssl/private/server.key; ssl on; access_log /var/log/nginx/ghost.access.log; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://xxx:2368; proxy_read_timeout 90; proxy_redirect http://xxx:2368 https://$servername:443; } } 

我收到的错误是

 2017/06/26 21:08:15 [emerg] 1#1: unknown "servername" variable nginx: [emerg] unknown "servername" variable 

当我用192.168.xx.xx(我的服务器的真实IP)replace$servername时,比一切工作正常。 但我希望它是dynamic的。

我怎样才能定义$ servername的值,以便我的docker将它拿起,它将被nginx使用?

或者我可以用另一种方式编写我的default.conf来实现这个dynamic?

使用envsubstdynamic地将环境variablesembedded到nginxconfiguration中。 envsubst是一个轻量级的模板引擎,它也包含在官方的nginx:alpine image中。

要将envsubst安装到您的自定义图像:

高山:

 $ apk --no-cache add gettext 

Debian的:

 $ apt-get install gettext-base 

这里是一个简单的例子来说明如何使用envsubst:

 $ cat test.conf.template hoge=$HOGE $ docker run --rm \ -v $(pwd)/test.conf.template:/tmp/test.conf.template \ -e HOGE=aaa \ nginx:alpine \ /bin/sh -c "envsubst < /tmp/test.conf.template > /tmp/test.conf && cat /tmp/test.conf" hoge=aaa 

请注意,如果要在configuration文件(如nginx.conf)中使用$符号,则需要指定要embedded的环境variables的名称。

将环境variablesSERVER_NAMEdynamicembedded到nginx.conf中的示例如下所示:

 server { listen 80; server_name ${SERVER_NAME}; return 301 https://${SERVER_NAME}$request_uri; } server { listen 443; server_name ${SERVER_NAME}; ssl_certificate /etc/ssl/private/server.crt; ssl_certificate_key /etc/ssl/private/server.key; ssl on; access_log /var/log/nginx/ghost.access.log; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://xxx:2368; proxy_read_timeout 90; proxy_redirect http://xxx:2368 https://${SERVER_NAME}:443; } } 

参数有些复杂,所以在docker-compose.yml格式中显示:

 version: '2' services: nginx: image: nginx:alpine command: > /bin/sh -c "envsubst ' $$SERVER_NAME '< /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'" volumes: - ./nginx.conf.template:/etc/nginx/nginx.conf.template ports: - 8080:80 environment: SERVER_NAME: "test.example.com"