envsubst, 为nginx容器引入自定义环境变量

envsubst的用法简介:

#添加测试变量

export myname=Leon

#查看结果。

注意上述单引号的用法,使用单引号代表字符串,而非变量。

新建测试文件t1.txt

将t1.txt文件内容输入envsubst,并输出到t2.txt

应用到nginx容器的例子:我需要在nginx.conf里引用一个自定义变量PT_IP,但是nginx默认不支持直接引用变量,这里用envsubst来转换。

如下为我的docker-compose.yml关于nginx的配置:

  nginx:

    image: nginx:latest

    container_name: My_Nginx

    ports:

      - "8001:8001"

    network_mode: "host"

    volumes:

      - /etc/timezone:/etc/timezone:ro

      - /etc/localtime:/etc/localtime:ro

      - ./nginx/conf.d/factory.conf.template:/etc/nginx/conf.d/factory.conf.template   

      //注意这里,宿主机conf.d目录下文件不能使用后缀为conf的文件,需更改后缀为tmplate或其它名称。因为容器启动后,envsubst会替换factory.conf.template为factory.conf。

      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf

      - ./nginx/log:/var/log/nginx

    environment:

      PT:    //缺省读取与yaml文件同级目录里的.env文件里的PT值。

    depends_on:

      - redis

      - mysql

    command: /bin/sh -c "envsubst '$$PT' < /etc/nginx/conf.d/factory.conf.template > /etc/nginx/conf.d/factory.conf && exec nginx -g 'daemon off;'"

    // ‘$$PT’ 这个是映射到容器内部的环境变量,格式必须这样写。

   // /etc/nginx/conf.d/factory.conf.template 读出中间文件template的内容,并通过envsubst来替换变量$PT

   // /etc/nginx/conf.d/factory.conf 转换变量$PT后的值输入正式文件factory.conf

    restart: always

………………………

容器启动后,进入容器查看变量是否替换成功。cat /etc/nginx/conf.d/factory.conf   //这个正式的文件,只能在容器内部看到,宿主机上看不到。宿主机上看到的是template的中间文件。

如果你的nginx里有多个server,即有好几个conf文件需要转换变量。可以使用command命令

1. 启动nginx.conf里的include功能,红框所示。

 2. 使用command引用脚本来执行对多个conf.template文件的变量转换。我在宿主机的./nginx/conf.d里创建了脚本文件main.sh,映射到/etc/nginx/conf.d/main.sh。

脚本如下所示:cat main.sh

#!/bin/bash

envsubst '$$A' < /etc/nginx/conf.d/factory.conf.template > /etc/nginx/conf.d/factory.conf

envsubst '$$B' < /etc/nginx/conf.d/app.conf.template > /etc/nginx/conf.d/app.conf

exec nginx -g 'daemon off;'

结束。

posted @ 2023-02-15 15:21  巴州夜雨  阅读(1124)  评论(0编辑  收藏  举报