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

實現思路

最后運行的命令大概是這樣:

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?{

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享