最近在部署项目时发现项目代码中有依赖的其他服务的ip和端口号,但是需要部署在三台不同的服务器上,每台服务器上的ip地址和端口号都不一样,这就需要打包三份不同的镜像分别部署,那有没有其他办法来完成动态更改呢?当然有,只需要以下四步搞定。
我们首先想到了dockerfile里面有个关键词ENV,官方给的解释是如下:
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
首先我们在dockerfile编写时设置环境变量,比如我要把ip和端口定义环境变量如下:
# base image
FROM ubuntu_apache_ci:latest
# MAINTAINER
MAINTAINER sangshuaidong <sangshuaidong@comleader.com.cn>
RUN rm -rf /home/wwwroot/default/* \
&& rm -rf /home/wwwroot/ci.localhost.com/* \
&& rm -rf /usr/local/apache/conf/httpd.conf \
&& rm -rf /usr/local/php/etc/php.ini \
&& rm -rf /usr/local/apache/conf/extra/httpd-vhosts.conf
# COPY
COPY ci.localhost.com/ /home/wwwroot/ci.localhost.com/
COPY ["start.sh", "/root/start.sh"]
COPY ["httpd.conf", "/usr/local/apache/conf/httpd.conf"]
COPY ["httpd-vhosts.conf", "/usr/local/apache/conf/extra/httpd-vhosts.conf"]
COPY dist* /home/wwwroot/default/
ENV MIMIC_BRACKET_HOST 192.168.22.113
ENV MIMIC_BRACKET_PORT 8091
RUN chmod -R 777 /home/wwwroot/ \
&& chmod -R 777 /root/start.sh
WORKDIR /root
#CMD
CMD ["/bin/bash","./start.sh"]
EXPOSE 8000 443 9000
上面我们定义了两个环境变量MIMIC_BRACKET_HOST和MIMIC_BRACKET_PORT,这样我们就可以容器中使用,
比如我们的项目配置文件在config文件夹下,我们把我们的配置项参数值修改为唯一名MIMIC_BRACKET_HOST_ENV和MIMIC_BRACKET_PORT_ENV,要确保这个名字在改文件内为唯一的这样才能方便我们后面替换!!
sed -i -e "s#MIMIC_BRACKET_HOST_ENV#${MIMIC_BRACKET_HOST}#" /home/wwwroot/ci.localhost.com/application/config/access.php
sed -i -e "s#MIMIC_BRACKET_PORT_ENV#${MIMIC_BRACKET_PORT}#" /home/wwwroot/ci.localhost.com/application/config/access.php
上面的意思就是把配置文件内的字符MIMIC_BRACKET_HOST_ENV和MIMIC_BRACKET_PORT_ENV换成我们镜像的环境变量
完成以上几步就可以使用docker build构建镜像了,注意:大家在写dockerfile时尽量遵循规则,避免重复多层,因为每一条命令在构建时就会新增一层,层数越大镜像自然也就越大!
启动容器
docker run -dit --net=host --privileged=true --name=ubuntu_apache_ci_v1 -e MIMIC_BRACKET_HOST="1.1.1.1" -e MIMIC_BRACKET_PORT="8888" ubuntu_apache_ci:v1
使用-e 参数 把我们要修改的变量通过参数传递进去,如果不指定参数的话,默认就会按照dockerfile里面的默认值。
我们进去容器看下效果:
docker exec -it adb67edebffd /bin/bash
可以看到配置项已经更改,这样就可以解决我们在不同服务器上使用同一套镜像了,避免了频繁修改配置参数重复打包的工作!
评论