docker容器-nginx conf文件使用环境变量值
文章目录
- docker容器-nginx conf文件使用环境变量值
- 背景
- 方法
- docker-compose 使用
- command使用
- docker使用
- shell 脚本使用
docker容器-nginx conf文件使用环境变量值
注意: 这篇文章仅作为记录用, 因为第一次搞也折腾了很久, 所以不要仔细看我的文章, 因为肯定会有更优雅更专业的解决方案
背景
使用docker 创建 nginx容器时, 如果需要设置conf文件, 并且conf文件中使用到宿主机的ip时, 我们更希望这个 ip 是可以动态替换的, 比如使用环境变量.
方法
https://hub.docker.com/_/nginx- 在 nginx 配置中使用环境变量(1.19 中的新功能)1. 创建环境变量
2. 创建 xxx.conf.template 文件
3. .template 文件中使用环境变量值
4. nginx容器会自动将 xxx.conf.template 转换为 xxx.conf 文件, 其中的变量也会正常替换.
docker-compose 使用
docker-compose.yaml
version: "3.6"services:test-server:container_name: test_server_nginximage: nginx:1.20.0ports:- "8155:80"environment:- NGINX_HOST=127.1.1.1- NGINX_PORT=80volumes:- ${PWD}/templates:/etc/nginx/templates- ${PWD}/conf:/etc/nginx/conf.d
default.conf.template
编写 .template 文件
server {listen ${NGINX_PORT};location / {root /opt/web_dist;index index.html index.htm;try_files $uri $uri/ /index.html;}location /api/ {proxy_pass ${NGINX_HOST}/; }
}
启动容器
docker-compose up -d
可以看到, 挂载的conf目录中的 conf文件已经是正常的了(虽然不能用)
server {listen 80;location / {root /opt/web_dist;index index.html index.htm;try_files $uri $uri/ /index.html;}location /v2api/ {proxy_pass 127.1.1.1/; }
}
command使用
与上面的compose使用是一样的, 不过更多的是使用 command 命令行自定义
- 目的
我们使用port为10086 进行端口的替换来测试可以看到, 我们将conf.d文件挂载至 ./conf 文件中, 下一步需要创建中间文件command指令:bin/bash -c "envsubst '$$PORT' < /etc/nginx/conf.d/source.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;' "通过 envsubst 将容器内的环境变量替换并读出至中间文件 source.template, 然后再全部输出到我们的 conf 配置文件中
- 步骤
docker-compose.yaml
version: "3.6"services:test-server:container_name: test-server_nginximage: nginx:1.20.0ports:- "8155:80"environment:- PORT=10086volumes:- ${PWD}/conf:/etc/nginx/conf.dcommand:- bin/bash- -c- "envsubst '$$PORT' < /etc/nginx/conf.d/source.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;' "
source.template
upstream index {server 192.168.0.85:${PORT};
}
server {listen 80;charset utf-8;server_name 127.0.0.1;location / {proxy_pass http://index/test;}
}
启动
docker-compose up -d
查看 defalut.conf
文件
upstream index {server 192.168.0.85:10086;
}
server {listen 80;charset utf-8;server_name 127.0.0.1;location / {proxy_pass http://index/test;}
}
可以看到已经被替换成功了
docker使用
与上面的一样, 创建template文件
注意创建的目录, 需要挂载出来 /etc/nginx/templates/
然后启动容器
docker run -d --name nginx -e NGINX_PORT=80 -v $(PWD)/template:/etc/nginx/templates/ nginx:1.20.0
注意点:
默认情况下,该函数读取模板文件/etc/nginx/templates/*.template并将执行结果输出envsubst到/etc/nginx/conf.d.可以通过以下环境变量更改此行为:- NGINX_ENVSUBST_TEMPLATE_DIR它包含模板文件的目录(默认值:/etc/nginx/templates)当这个目录不存在时,这个函数不会做任何模板处理。- NGINX_ENVSUBST_TEMPLATE_SUFFIX模板文件的后缀(默认值:.template)该函数只处理名称以该后缀结尾的文件。- NGINX_ENVSUBST_OUTPUT_DIR一个目录,执行envsubst的结果被输出(默认值:/etc/nginx/conf.d)输出文件名是去掉后缀的模板文件名。ex.)/etc/nginx/templates/default.conf.template将与文件名一起输出/etc/nginx/conf.d/default.conf。此目录必须可由运行容器的用户写入。
shell 脚本使用
直接在shell脚本文件中定义, 替换宿主机中的文件, 宿主机的文件同时又是nginx docker容器挂载出来的conf配置文件.流程 .sh 文件内根据 .env 里的环境变量, 修改template文件, 将template文件中的变量参数替换, 重定向输出到 conf 文件. 此conf文件同时是 nginx容器挂载的默认配置.由此达成配置
.env
文件
VMP_SERVER_IP=127.0.0.1
APP_PORT=8111
.sh
文件实例
source ./.envNGINX_CONF_FILE="${PWD}/service/nginx"export NGINX_VMP_SERVER="http://${VMP_SERVER_IP}:${APP_PORT}/"envsubst '${NGINX_VMP_SERVER}' < ${NGINX_CONF_FILE}/default.conf.template > ${NGINX_CONF_FILE}/default.confunset NGINX_VMP_SERVER
default.conf.template
文件
server {listen 80;root /opt/web_dist;index index.html;location / {try_files $uri /index.html;index index.html;}location /v2api/ {proxy_pass ${NGINX_VMP_SERVER}; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
default.conf
文件
server {listen 80;root /opt/web_dist;index index.html;location / {try_files $uri /index.html;index index.html;}location /v2api/ {proxy_pass http://127.0.0.1:8111/; proxy_set_header Host $proxy_host; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
docker容器-nginx conf文件使用环境变量值相关推荐
- mysql sail_再谈docker搭建nginx+php+mysql开发环境 | Sail
写在前面 前几天我写了一篇博客docker搭建nginx+php+mysql开发环境.当时主要是参考一片博文搭建记录的. 可是这样搭建出来是有一些问题的,具体的原因我还没找出.当然那篇文章还是有一些参 ...
- 三步使用Docker容器创建RoboCup仿真2D环境
本文相关视频: 三步使用Docker容器创建RoboCup仿真2D环境_哔哩哔哩_bilibili RoboCup是机器人足球世界杯[,最早于1997年在日本名古屋举办,有来自全世界38支球队参加仿真 ...
- Docker容器修改hosts文件重启不变
Docker容器修改hosts文件重启不变 1./etc/hosts, /etc/resolv.conf和/etc/hostname容器中的这三个文件不存在于镜像,而是存在于于/var/lib/doc ...
- Docker容器与本地文件相互拷贝
Docker容器中的文件可以与本地进行共享. 1.Docker容器中的文件拷贝至本地 #格式 #docker cp CONTAINER ID:容器目录 本地目录 #示例 docker ps -a #查 ...
- linux 误删nginx.conf文件恢复
当你不小心误删或者错误操作导致nginx.conf文件丢失,而且nginx处于在住运行的状态,在这种情况下我们就可以在内存中获取配置文件. 1.获取nginx进程pid ps -ef | grep n ...
- 【自学Docker容器二 ● Linux下Dokcer环境安装 】
Docker自学系列 第一篇 [自学Docker容器一 ● 基础知识 ] 第二篇 [自学Docker容器二 ● Linux下Dokcer环境安装 ] 第三篇 [自学Docker容器三 ● Docker ...
- php修改父进程变量,shell子进程修改父进程的环境变量值
shell子进程修改父进程的环境变量值 脚本中的环境变量通过 export 导出,脚本中调用其他脚本使用这个变量 这里有两个脚本程序 hello 和 hello1 hello 脚本代码 #!/bin/ ...
- 验证docker容器相当轻量级Linux运行环境,每个容器内有属于自己的文件系统,容器之间相互隔离
一.docker的三个重要概念 1.镜像:打包项目带上环境,即镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包含了一些为运行时准备的配置参数.镜像 ...
- 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)
操作系统 [root@Optimus /]# uname -a Linux Optimus 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2 ...
- 宿主机和docker容器之间的文件拷贝
1.从容器里面拷文件到宿主机 在宿主机里面执行以下命令: docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 示例: 假设容器名为nginx,要从容器里面拷贝的文件路为 ...
最新文章
- linux如何给用户加sudo权限,如何在Linux环境为用户添加sudo权限
- MVC,MVP与MVVM
- centos打显卡驱动命令_在Linux系统下安装Nvidia官方显卡驱动的方法
- c语言使用求余方式的转化为二进制程序,C语言第三讲 程序结构 (下).ppt
- 图书馆管理系统用户端心得
- 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析
- 第14章 任务和特权级保护
- VBA 脚本快速copyExcel单元格的格式
- bootstrap的ajax提交
- Google 宣布 Kotlin-first 已四年,为什么 Java 开发者仍不买账?
- MySql数据库导出完整版(导出数据库,导出表,导出数据库结构)
- 【渝粤教育】电大中专品牌管理与推广 (2)_1作业 题库
- oracle和sqlserver数据库直接生成xml
- C语言谭浩强版本学习笔记(1)
- ioncube php encode,ionCube PHP解密
- j1900 nas安装windows蓝屏,无网卡连不上网
- Nature reviews Neurology:癫痫合并神经行为障碍:基于网络的精确分类
- 用自己拍的一张照片做海报
- 使用.NET Micro ORM “Symbiotic”的简单 CRUD
- 多媒体技术应用是计算机,【多媒体技术论文】计算机教学多媒体技术应用(共2949字)...
热门文章
- 破解Esxi服务器中Windows虚机密码(Esxi服务器Windows虚拟机忘记密码解决方案)
- 使用 keepalived 设置虚拟 IP 环境
- “dying ReLU“问题
- ural 1104. Don’t Ask Woman about Her Age
- GB/T28181视频国标平台级联给上级自定义级联的国标设备编号解决不同设备重复的通道编号问题
- bp抓包挂代理127.0.0.1服务器出现“有软件正在阻止Firefox安全连接至网站”问题的解决方法
- 各个国家的人有什么特点?
- python 余弦值_余弦相似度
- 阿里云安全中心是什么?提供哪些防护?
- chrome浏览器启动页被篡改为360导航