当我在Docker中创建Nginx容器后,.conf.template文件不再起作用
当我尝试将在本地使用docker-compose构建的环境转移到共享环境时,发现Nginx无法使用模板,所以我将其作为备忘录记录下来。
设定
我們將略過詳細的內容。
proxy:
image: nginx
container_name: proxy
volumes:
- ./nginx/dev.conf.template:/etc/nginx/templates/default.conf.template
ports:
- 80:80
environment:
- SERVER_PORT=3000
- LISTEN_PORT=80
server {
listen ${LISTEN_PORT};
server_name localhost;
location / {
proxy_pass http://localhost:${SERVER_PORT}/;
}
}
结论
将nginx的Docker镜像升级至1.20版本。
对调查的内容进行概括说明
我使用 “docker exec -it proxy sh” 命令进入容器内并确认了模板文件已经正确地被复制。然后我在本地和共享环境中使用 “docker images” 命令来确认镜像版本,结果两者都是最新的版本,但是它们的创建日期有所不同。
在 DockerHub 上确认版本时,发现本地环境的最新版本为 1.20,而共享环境的最新版本为 1.21。
因此,我試著將Nginx的Docker映像升級到1.20版本,結果它成功地按照模板進行了反向代理。
proxy:
image: nginx:1.20
尽管真正的原因尚不清楚,但我们决定一旦采取这种方式来避免。
看了DockerHub的说明,似乎模板本身是在1.19版本中新增的功能,所以可能还不太稳定。
在nginx配置中使用环境变量(自1.19版本起)
默认情况下,大多数配置块中的nginx不支持环境变量。但是这个镜像有一个函数,在nginx启动之前会提取环境变量。
下面是一个使用docker-compose.yml的示例:
web:
image:nginx
volumes:
– ./templates:/etc/nginx/templates
ports:
– “8080:80”
environment:
– NGINX_HOST=foobar.com
– NGINX_PORT=80默认情况下,这个函数会读取/etc/nginx/ templates / * .template中的模板文件,并将执行envsubst的结果输出到/etc/nginx/conf.d。
因此,如果您放置templates / default.conf.template文件,其中包含如下变量引用:
listen $ {NGINX_PORT};
输出到/etc/nginx/conf.d/default.conf中的内容如下:
listen 80;
通过以下环境变量可以更改此行为:
NGINX_ENVSUBST_TEMPLATE_DIR
包含模板文件的目录(默认值:/etc/nginx/templates)
当该目录不存在时,此函数将不会处理模板。NGINX_ENVSUBST_TEMPLATE_SUFFIX
模板文件的后缀(默认值:.template)
此功能仅处理文件名以此后缀结尾的文件。NGINX_ENVSUBST_OUTPUT_DIR
执行envsubst后的结果输出目录(默认值:/etc/nginx/conf.d)
输出的文件名是将模板文件名去除后缀的结果。
例如)/etc/nginx/templates/default.conf.template将以文件名/etc/nginx/conf.d/default.conf输出。
该目录必须由运行容器的用户具有写权限。
参考来源:https://hub.docker.com/_/nginx
请引用以下来源:https://hub.docker.com/_/nginx