公司在搭建docker自动化部署时,需要制作一个nginx镜像在其docker run时通过外部指定环境变量使得容器中的配置文件自动生成,不需要再到容器里改配置文件。
实现思路
最后运行的命令大概是这样:
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 centosENV 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










