nginx如何在docker容器中自动生成配置文件

发布时间 - 2023-05-25 00:00:00    点击率:

实现思路

最后运行的命令大概是这样:

docker run -d -p 80:80 -e xxx=xx 镜像名称 镜像中脚本路径

这里的脚本会代替dockerfile中的cmd指令,所以我们要构建一个自动生成且启动nginx的shell脚本。

#!/bin/bash

#从环境变量里面获取lt开头,为了与其他环境变量区别开,例如lt_analysis=172.17.0.1:8083
result=""
for a in $(env | grep ^lt)
do
 old_ifs="$ifs"
 ifs="_"
 arr=($a)
 b=${arr[1]}
 ifs="="
 arr=($b)
 ifs="$old_ifs"
 result="${result}
  location /${arr[0]}/ {
    proxy_pass  http://${arr[1]}/${arr[0]}/;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
  }"
done
#将nginx配置文件中nginx_conf中置换成变量result
sed -i "s|nginx_conf|$(echo ${result})|g" /etc/nginx/nginx.conf
cd /usr/sbin
./nginx

需要说明的一点是业务中并不需要将整个配置文件生成,只需要将其中location生成然后替换原配置文件中标记的位置,下面就是原配置文件标记的位置。

http {
  ...
  
  server {
    ...

    location / {
      root  html;
      index index.html index.htm;
    }

    nginx_conf

    #error_page 404       /404.html;
    ...

我以为将这个shell脚本和默认的配置文件放入nginx的dockerfile镜像中,然后就成功了,但是...运行上述命令之后容器没有起来,查看容器日志,出来的信息却是***syntax error: “(” unexpected***。我的shell脚本在centos上经过测试是可以运行的,那么为什么会报这个错呢? 经过排查,原来是dockerfile使用基础镜像是官方nginx,官方的镜像使用ubuntu不再使用bash来而是dash执行shell脚本,真是个坑 。没办法我只好修改dockerfile,下面就是使用基础镜像centos。

from centos

env nginx_version 1.10.3
env openssl_version 1.0.2k
env pcre_version 8.40
env zlib_version 1.2.11
env build_root /usr/local/xx/nginx

# 为了减小最终生成的镜像占用的空间,这里没有执行yum update命令,可能不是好的实践
# 为了加快构建速度,这里使用了163的安装源
#run yum -y update \
run yum -y install curl \
  && mv /etc/yum.repos.d/centos-base.repo /etc/yum.repos.d/centos-base.repo.backup \
  && curl http://mirrors.163.com/.help/centos7-base-163.repo -o /etc/yum.repos.d/centos7-base-163.repo \ 
  && yum -y install gcc gcc-c++ make perl zip unzip \
  && mkdir -p $build_root \
  && cd $build_root \
  && curl https://ftp.pcre.org/pub/pcre/pcre-$pcre_version.zip -o $build_root/pcre-$pcre_version.zip \
  && curl https://www.openssl.org/source/openssl-$openssl_version.tar.gz -o $build_root/openssl-$openssl_version.tar.gz \
  && curl http://www.zlib.net/zlib-$zlib_version.tar.gz -o $build_root/zlib-$zlib_version.tar.gz \
  && curl https://nginx.org/download/nginx-$nginx_version.tar.gz -o $build_root/nginx-$nginx_version.tar.gz \
  && tar vxzf nginx-$nginx_version.tar.gz \
  && unzip pcre-$pcre_version.zip \
  && tar vxfz zlib-$zlib_version.tar.gz \
  && tar vxfz openssl-$openssl_version.tar.gz \
  && cd nginx-$nginx_version \
  && build_config="\
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --with-openssl=$build_root/openssl-$openssl_version \
    --with-pcre=$build_root/pcre-$pcre_version \
    --with-zlib=$build_root/zlib-$zlib_version \
    --with-http_ssl_module \
    --with-http_v2_module \ 
    --with-threads \
    " \
  && mkdir -p /var/cache/nginx \
  && ./configure $build_config \
  && make && make install \
  && rm -rf $build_root \
  && yum -y remove gcc gcc-c++ make perl zip unzip \
  && yum clean all

#替换nginx默认文件
copy nginx.conf /etc/nginx/
#添加自动生成配置文件的shell脚本
copy 脚本名称 /root/

#暴露端口
expose 80 443

cmd ["nginx", "-g", "daemon off;"]

提醒:docker容器不支持后台运行,当命令执行之后,容器也会自然退出,这里我们需要将nginx配置文件设置一下

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid    logs/nginx.pid;
daemon off;  //这里添加,关闭后台运行
events {
  worker_connections 1024;
}


http {


# docker  # nginx  # bash  # dash  # Error  # location  # ubuntu  # centos  # 镜像  # 配置文件  # 要将  # 会报  # 自动生成  # 是个  # 也会  # 却是  # 是这样  # 只需 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作报价单模板图片,小松挖机官方网站报价?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  黑客如何利用漏洞与弱口令入侵网站服务器?  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何处理和验证JSON类型的数据库字段  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Bootstrap整体框架之CSS12栅格系统  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  ,南京靠谱的征婚网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  详解jQuery中基本的动画方法  Laravel如何发送系统通知?(Notification渠道示例)  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何在建站宝盒中设置产品搜索功能?  如何在景安云服务器上绑定域名并配置虚拟主机?  浅析上传头像示例及其注意事项  Java垃圾回收器的方法和原理总结  如何快速搭建高效服务器建站系统?  如何在阿里云部署织梦网站?  轻松掌握MySQL函数中的last_insert_id()  如何用腾讯建站主机快速创建免费网站?  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel定时任务怎么设置_Laravel Crontab调度器配置  linux top下的 minerd 木马清除方法  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何用虚拟主机快速搭建网站?详细步骤解析  微信小程序 闭包写法详细介绍  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  php结合redis实现高并发下的抢购、秒杀功能的实例  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  网站页面设计需要考虑到这些问题  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何为不同团队 ID 动态生成多个独立按钮  黑客入侵网站服务器的常见手法有哪些?  微信小程序 require机制详解及实例代码  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  高防服务器租用如何选择配置与防御等级?  如何在宝塔面板创建新站点?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在云主机快速搭建网站站点?  如何快速配置高效服务器建站软件?