Docker启动nginx并读取环境变量
- 一、 简介
- 二、 准备nginx镜像
- 1. 编写基础nginx的Dockerfile
- 2. 构建基础nginx镜像
- 三、 准备html文件
- 四、 准备nginx.conf.template文件
- 五、 准备入口脚本docker-entrypoint.sh
- 六、 准备dockerfile文件
- 七、 构建镜像
- 八、 启动nginx服务
- 九、 访问浏览器验证
- 十、 备注
一、 简介
Nginx代理后台接口地址,是将后台接口配置在配置文件nginx.conf文件中,但是nginx.conf文件无法直接使用“$”读取linux的环境变量,本次使用docker启动nginx方式,并配置nginx读取docker的环境变量。本次使用的方法是envsubst方式,并将envsubst命令写入一个入口脚本中,简化启动nginx服务命令
二、 准备nginx镜像
1. 编写基础nginx的Dockerfile
Nginx-1.1.16为nginx-1.1.16.tar.gz源码解压后的文件,可在nginx官网下载
# 镜像名称:nginx-test-env
#基础镜像,可自己拉取centos7镜像
FROM docker.io/openshift/base-centos7
#设置对应环境变量,方便自己知道版本是多少
ENV NGINX_VERSION=1.16.1
#维护者信息
LABEL maintainer="tianguohui <tiangh@puhuilink.com>"
#将nginx源码包复制到容器中,并运行命令安装nginx1.1.16
RUN mkdir -p /root/nginx/nginx-1.1.16
COPY ./nginx-1.1.16 /root/nginx/nginx-1.1.16
RUN cd /root/nginx/nginx-1.1.16 && \
./configure --prefix=/usr/local/nginx --with- http_stub_status_module --with-http_ssl_module && \
make && make install && \
/usr/local/nginx/sbin/nginx -V
#映射端口
EXPOSE 8080
2. 构建基础nginx镜像
构建基础nginx镜像
docker build -t nginx-test-env ./
三、 准备html文件
将自己前端代码编译打包,并将打包后的dist文件重命名为html,放入Dockerfile同级目录下
四、 准备nginx.conf.template文件
将以下内容放入server模块中
server {
listen 8080;
server_name localhost;
location / {
root /opt/app-root/src/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location ^~/api/ {
proxy_pass http://${JAVA_API_LOGIN_IP}:${JAVA_API_LOGIN_PORT}/;
}
location ^~/sms/ {
proxy_pass http://${JAVA_SMS_IP}:${JAVA_SMS_PORT}/;
}
location ^~/ngecc/ {
proxy_pass http://${HASURA_NGECC_IP}:${HASURA_NGECC_PORT}/;
}
location ^~/xunjian/ {
proxy_pass http://${HASURA_XUNJIAN_IP}:${HASURA_XUNJIAN_PORT}/;
}
location ^~/cache/ {
proxy_pass http://${HASURA_CACHE_IP}:${HASURA_CACHE_PORT}/;
}
location ^~/main/ {
proxy_pass http://${HASURA_MAIN_IP}:${HASURA_MAIN_PORT}/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
五、 准备入口脚本docker-entrypoint.sh
使用${XXX}读取docker环境变量,在nginx.conf.template文件中使用环境变量,使用envsubst将nginx.conf.template中的内容覆盖nginx.conf文件内容,实现读取环境变量
vim docker-entrypoint.sh
#!/usr/bin/env sh
set -eu
envsubst '${JAVA_API_LOGIN_IP} ${JAVA_API_LOGIN_PORT} ${JAVA_SMS_IP} ${JAVA_SMS_PORT} ${HASURA_NGECC_IP} ${HASURA_NGECC_PORT} ${HASURA_XUNJIAN_IP} ${HASURA_XUNJIAN_PORT} ${HASURA_CACHE_IP} ${HASURA_CACHE_PORT} ${HASURA_MAIN_IP} ${HASURA_MAIN_PORT}' < /usr/local/nginx/nginx.conf.template > /usr/local/nginx/conf/nginx.conf
exec "$@"
六、 准备dockerfile文件
环境变量设置为自己需要的ip地址和port端口
# docker-nginx
#基础镜像
FROM nginx-test-env
#设置对应环境变量,方便自己知道版本是多少
ENV NGINX_VERSION=1.16.1 \
JAVA_API_LOGIN_IP=127.0.0.1 \
JAVA_API_LOGIN_PORT=8080 \
JAVA_SMS_IP=127.0.0.1 \
JAVA_SMS_PORT=8080 \
HASURA_NGECC_IP=127.0.0.1 \
HASURA_NGECC_PORT=8080 \
HASURA_XUNJIAN_IP=127.0.0.1 \
HASURA_XUNJIAN_PORT=8080 \
HASURA_CACHE_IP=127.0.0.1 \
HASURA_CACHE_PORT=8080 \
HASURA_MAIN_IP=127.0.0.1 \
HASURA_MAIN_PORT=8080
#维护者信息
LABEL maintainer="tianguohui <tiangh@puhuilink.com>"
COPY nginx.conf.template /usr/local/nginx/nginx.conf.template
COPY docker-entrypoint.sh /
RUN mkdir -p /opt/app-root/src && \
chmod 777 /docker-entrypoint.sh
COPY html /opt/app-root/src/html
ENTRYPOINT ["/docker-entrypoint.sh"]
#映射端口
EXPOSE 8080
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
七、 构建镜像
docker build -t docker-nginx ./
八、 启动nginx服务
docker run --name nginx -itd -p 28080:8080 docker-nginx
九、 访问浏览器验证
浏览器访问http://xx.xx.xx.xx:28080,可以登录系统,查看数据
十、 备注
验证是否读取的环境变量,可修改第6步中的dockerfile文件中的环境变量,后台登录接口的IP或者端口故意写错,再次构建镜像运行,使用浏览器验证时,无法登录系统,接口调用失败