TL; DR
Nginx 的官方 Docker Image 中自带了 ENVSUBST 支持,可以在 Docker Compose 中动态注入环境变量。
1 前言
由于需要在多台机器上部署不同域名的服务,所以需要在 Nginx 中动态注入域名,而不是写死在配置文件中。
但是 Docker 中直接编写环境变量,或者是直接挂载 Nginx.conf 默认是不支持动态注入的,需要自己构建一个支持动态注入的 Nginx。
2 解决方案
2.1 思路与想法
Nginx 官方的 Docker Image 中自带了 ENVSUBST 支持,可以在 DockerCompose 中动态注入环境变量。
[Github 项目点击跳转]: https://github.com/copriwolf/Docker2Nginx.git
2.2 具体事例
2.2.1 文件树
1 2 3 4 5 6 7 8 9 10
| . |-- docker-compose.yml `-- nginx |-- html | `-- index.html |-- logs | `-- nginx | |-- access.log | `-- error.log `-- nginx.conf
|
2.2.1 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| version: '3.5' services: nginx_lb: container_name: nginx_lb image: nginx:alpine ports: - "80:80" - "80:80/udp" volumes: - ./nginx/nginx.conf:/etc/nginx/templates/nginx.conf.template:ro - ./nginx/logs/nginx:/var/log/nginx - ./nginx/html:/usr/share/nginx/html environment: API_HOST: {{域名}} API_PORT: {{端口,比如80}} restart: unless-stopped
|
2.2.2 Nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
server { listen ${API_PORT}; server_name ${API_URL}; root /var/www/html; index index.html index.htm index.php;
location / { try_files $uri $uri/ /index.php?$query_string; }
location = /favicon.ico { log_not_found off; }
}
log_format main_demo '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main_demo;
|
2.2.3 启动
1 2 3 4 5 6 7 8 9 10
|
$ git clone https://github.com/copriwolf/Docker2Nginx.git
$ sudo docker compose up --build -d
$ sudo docker logs -f
|
2.2.4 说明
- 因为 ENVSUBST 脚本默认挂载到
/etc/nginx/conf.d
目录下, 所以在 nginx.conf
中不能出现 http{}
, 可以直接写入 server 层。