實現思路
最後運行的命令大概是這樣:
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 {
以上是nginx如何在docker容器中自動產生設定檔的詳細內容。更多資訊請關注PHP中文網其他相關文章!