[ 生活需要仪式感 ]

0%

Docker Nginx 动态注入变量

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 配置映射
- ./nginx/logs/nginx:/var/log/nginx # Nginx 日志目录
- ./nginx/html:/usr/share/nginx/html # Nginx 文件目录
environment:
API_HOST: {{域名}}
API_PORT: {{端口,比如80}}
# 其他的 Nginx 变量
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

##### {{{ DEMO 服务配置 #####
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;
}

# 转发也行
# proxy_connect_timeout 5s;
# proxy_timeout 20s;
# proxy_pass 127.0.0.1:1235;

}
##### }}} #####

##### {{{ DEMO TEMPLATE 日志格式 #####
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

# 1 拉取代码
$ git clone https://github.com/copriwolf/Docker2Nginx.git
# 2 修改配置
# -- 修改 `docker-compose.yml` 的环境变量,访问端口
# -- 修改 `nginx/html/index.html` 的 nginx 网页内容
# 3 启动
$ sudo docker compose up --build -d
# 4 观察日志
$ sudo docker logs -f

2.2.4 说明

  • 因为 ENVSUBST 脚本默认挂载到 /etc/nginx/conf.d 目录下, 所以在 nginx.conf 中不能出现 http{}, 可以直接写入 server 层。