實(shí)現(xiàn)思路
最后運(yùn)行的命令大概是這樣:
docker?run?-d?-p?80:80?-e?xxx=xx?鏡像名稱?鏡像中腳本路徑
這里的腳本會(huì)代替dockerfile中的cmd指令,所以我們要構(gòu)建一個(gè)自動(dòng)生成且啟動(dòng)nginx的shell腳本。
#!/bin/bash #從環(huán)境變量里面獲取lt開頭,為了與其他環(huán)境變量區(qū)別開,例如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
需要說(shuō)明的一點(diǎn)是業(yè)務(wù)中并不需要將整個(gè)配置文件生成,只需要將其中l(wèi)ocation生成然后替換原配置文件中標(biāo)記的位置,下面就是原配置文件標(biāo)記的位置。
http?{ ??... ?? ??server?{ ????... ????location?/?{ ??????root??html; ??????index?index.html?index.htm; ????} ????nginx_conf ????#error_page?404???????/404.html; ????...
我以為將這個(gè)shell腳本和默認(rèn)的配置文件放入nginx的dockerfile鏡像中,然后就成功了,但是…運(yùn)行上述命令之后容器沒(méi)有起來(lái),查看容器日志,出來(lái)的信息卻是***syntax error: “(” unexpected***。我的shell腳本在centos上經(jīng)過(guò)測(cè)試是可以運(yùn)行的,那么為什么會(huì)報(bào)這個(gè)錯(cuò)呢? 經(jīng)過(guò)排查,原來(lái)是dockerfile使用基礎(chǔ)鏡像是官方nginx,官方的鏡像使用ubuntu不再使用bash來(lái)而是dash執(zhí)行shell腳本,真是個(gè)坑 。沒(méi)辦法我只好修改dockerfile,下面就是使用基礎(chǔ)鏡像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 #?為了減小最終生成的鏡像占用的空間,這里沒(méi)有執(zhí)行yum?update命令,可能不是好的實(shí)踐 #?為了加快構(gòu)建速度,這里使用了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默認(rèn)文件 copy?nginx.conf?/etc/nginx/ #添加自動(dòng)生成配置文件的shell腳本 copy?腳本名稱?/root/ #暴露端口 expose?80?443 cmd?["nginx",?"-g",?"daemon?off;"]
提醒:docker容器不支持后臺(tái)運(yùn)行,當(dāng)命令執(zhí)行之后,容器也會(huì)自然退出,這里我們需要將nginx配置文件設(shè)置一下
#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;??//這里添加,關(guān)閉后臺(tái)運(yùn)行 events?{ ??worker_connections?1024; } http?{