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?
使用envsubst
dynamic地将环境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_NAME
dynamicembedded到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"
- Docker:如何在Docker容器中调整运行在主机上的本地服务器xyz.example.com
- Jenkinspipe道docker.image调用会生成一个超时
- Docker Lamp Centos7:'/ bin / sh -c systemctl start httpd.service'返回一个非零的代码:1
- Cent OS 6上的Docker无法在切换到不同的容器目录后build立容器
- Docker在磁盘空间上的aufs虽然DF显示丰富
- 群中副本的数量不在工作节点中开始(1/4)
- 在Docker中运行openstack容器时,为什么会出现“Watchdog:BUG:Soft lockup CPU”错误。
- 是否有像Kubernetes的仪表板/用户界面的Docker Swarm仪表板?
- 为无状态Web应用程序创build多节点Kubernetes群集