Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxx=xxx先往容器注入环境变量,然后进一步通过envsubst指令将环境变量写入到conf文件中,实现动态配置文件内容。

背景

前后端分离的架构下,经常会用到nginx反向代理来解决跨域问题。部署时,同一份前端代码有时候会根据开发环境不同,切换不同的后端接口地址进行代理,或者会部署到不同的环境中。这些都需要配置不同的后端地址,想法是打包好的镜像不需要改动,部署到不同的环境时,启动docker容器时,注入不同的后端地址。

实现

以前端打包好的dist文件夹开始,dist文件夹同级放Dockerfile和nginx.tmpl文件,

Dockerfile文件内容

bash 复制代码
FROM nginx:alpine

COPY dist/ /usr/share/nginx/html

COPY nginx.tmpl /etc/nginx/conf.d

EXPOSE 80

WORKDIR /etc/nginx/conf.d

ENTRYPOINT envsubst '$APP_ROOT' < nginx.tmpl > default.conf && cat default.conf && nginx -g 'daemon off;'

nginx.tmpl文件内容

bash 复制代码
server {
    listen 80;
    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
        index index.html;
    }

    location /api/ {
	    proxy_read_timeout 200s;
	    proxy_send_timeout 200s;
	    proxy_pass  $APP_ROOT;
	    proxy_set_header Host $host:$server_port;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

这里实现环境变量注入的核心原理是利用linux自带的envsubst指令。envsubst 'APP_ROOT' \< nginx.tmpl作用是取环境的APP_ROOT的值注入到nginx.tmpl模板里对应的位置,然后后半句> default.conf是将替换好变量后的模板内容写入到docker容器内/etc/nginx/conf.d文件夹下的default.conf文件里。cat default.conf这句话方便我们查看nginx的配置内容,也可以不加。

执行docker build -t xxxxx:vvv .打包镜像

执行docker run -e APP_ROOT=http://xxx.xxx.xxx.xxx:yyy/ xxxxx:vvv 运行容器,通过-e将后端服务地址通过APP_ROOT环境变量注入

通过docker logs xxxxxx 查看docker日志,可以看到通过cat default.conf输出的内容,可以看到nginx.tmpl里面的$APP_ROOT被注入的环境变量替换掉了。

说明

镜像的基础镜像nginx:alpine中,nginx的配置文件在/etc/nginx/nginx.conf文件,打开查看内容,

可以看到include这个,包含了所有conf.d目录下的所有conf文件,所以我们修改的文件放在了conf.d目录下。

另外还有一点很重要,docker启动时的命令行注入的环境变量-e APP_ROOT=http://xxx.xxx.xxx.xxx:yyy/,一定要以/结尾,否则,转发到后端时,不会把/api前缀去掉,我一开始没有注意这个细节问题,被困扰了很长时间才搞定。这儿也可以用更详细的rewrite实现。

相关推荐
刘若水14 分钟前
Linux: 进程信号初识
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )32 分钟前
玛卡巴卡的k8s知识点问答题(六)
云原生·容器·kubernetes
rider18935 分钟前
【1】搭建k8s集群系列(二进制部署)之系统初始化
云原生·容器·kubernetes
阳小江1 小时前
Docker知识点
运维·docker·容器
极客柒2 小时前
RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
服务器·docker·开源
只是橘色仍温柔2 小时前
xshell可以ssh连接,但vscode不行
运维·vscode·ssh
IT里的交易员2 小时前
【系统】换硬盘不换系统,使用WIN PE Ghost镜像给电脑无损扩容换硬盘
运维·电脑
共享家95272 小时前
深入剖析Linux常用命令,助力高效操作
linux·运维·服务器
小刘爱喇石( ˝ᗢ̈˝ )2 小时前
玛卡巴卡的k8s知识点问答题(七)
云原生·容器·kubernetes
大刘讲IT3 小时前
制造业数字化转型:流程改造先行还是系统固化数据?基于以MTO和MTS的投资回报分析
运维·经验分享·生活·产品经理·数据可视化