当我在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

广告
将在 10 秒后关闭
bannerAds