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

需求介紹

公司在搭建docker自動化部署時,須要製做一個nginx鏡像在其docker run時經過外部指定環境變量使得容器中的配置文件自動生成,不須要再到容器裏改配置文件。html

實現思路

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

docker run -d -p 80:80 -e xxx=xx 鏡像名稱 鏡像中腳本路徑
複製代碼

這裏的腳本會代替dockerfile中的CMD指令,因此咱們要構建一個自動生成且啓動nginx的shell腳本。c++

#!/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生成而後替換原配置文件中標記的位置,下面就是原配置文件標記的位置。docker

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。shell

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配置文件設置一下centos

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

複製代碼
相關文章
相關標籤/搜索