【问题标题】:How to set environment variables on docker compose for nginx?如何在 docker compose 上为 nginx 设置环境变量?
【发布时间】:2022-07-01 06:27:39
【问题描述】:

我的项目使用 CI/CD 进行部署,我为每个应用程序阶段(开发、暂存、发布)都有一个 docker-compose 文件。

根据应用程序所处的阶段,我想使用 Nginx 为我的 API 重定向用户以获得不同的 ip/port。

在我的 default.conf 文件中,我想写这样的内容。

server {
    listen       443 ssl;

    ssl_certificate /etc/ssl/server/cert.pem;
    ssl_certificate_key /etc/ssl/server/privkey.pem;

    location / {
        proxy_pass https://api:$API_PORT;
        proxy_set_header Host $host;
        ...

其中 api 是在我的 docker-compose 文件中定义的我的服务 IP 的引用,我希望 ${API_PORT} 是对我在 docker- 中定义的环境变量的引用撰写。

我的 docker-compose 文件如下所示。

version: "3"

services:
  api:
    ...
  ports:
      - 4000:4000
  nginx:
    ...
    environment:
      - API_PORT=4000
    ports:
      - 5180:80
      - 5181:443

我怎样才能做到这一点?

注意:如果我有一个静态端口,例如 4000,当我同时启动阶段和发布版本时,我将在端口 4000 上发生冲突。

【问题讨论】:

    标签: docker nginx docker-compose


    【解决方案1】:

    为了实现这一点,您需要设置 Dockerfile 并重命名 .conf 文件,以便 Nginx 了解您想要做什么。

    首先,Nginx 本身支持你想做的事情,所以你需要使用templates

    默认情况下,如果您将配置文件放在 /etc/nginx/templates 中并且文件名以 .template 结尾,Nginx 将使用 envsubst.conf 文件中的环境变量替换为您在 docker-compose 文件中定义的值。

    让我们举个例子。

    你有 default.conf.template(不要忘记重命名你的 .conf 文件)文件和你的 Nginx 设置:

    server {
        listen       443 ssl;
    
        ssl_certificate /etc/ssl/server/cert.pem;
        ssl_certificate_key /etc/ssl/server/privkey.pem;
    
        location / {
            proxy_pass https://api:$API_PORT;
            proxy_set_header Host $host;
            ...
    

    您的 Dockerfile 将复制您的 default.conf.template 文件并将其粘贴到 /etc/nginx/templates

    ...
    COPY /your/nginx/settings/folder/default.conf.template /etc/nginx/templates
    ...
    

    完成后,当 Nginx 开始运行时,它将在模板文件夹中搜索 *.template 文件,并在找到您的 default.conf.template 文件时会将环境变量引用替换为实际值,并将此文件移动到 /etc/nginx/conf.d 文件夹。

    如果您的 docker-compose 文件如下所示:

    version: "3"
    
    services:
      api:
        ...
      ports:
          - 4000:4000
      nginx:
        ...
        environment:
          - API_PORT=4000
    

    您的 default.conf.template 文件(如上所述)将重命名为 default.conf,移至 /etc/nginx/conf.d/ 看起来像这样:

    location / {
          proxy_pass https://api:4000;
          ...
    

    因此 Nginx 将替换值的引用并将 .conf 文件移动到正确的位置。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2022-11-10
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 2018-10-12
      • 2019-11-01
      相关资源
      最近更新 更多