如何在docker容器启动时动态更换项目中的配置项

Royal
2022-06-01 / 0 评论 / 515 阅读 / 正在检测是否收录...
  • 需求

最近在部署项目时发现项目代码中有依赖的其他服务的ip和端口号,但是需要部署在三台不同的服务器上,每台服务器上的ip地址和端口号都不一样,这就需要打包三份不同的镜像分别部署,那有没有其他办法来完成动态更改呢?当然有,只需要以下四步搞定。
2022-06-01T05:12:50.png

  • dockerfile的环境变量

我们首先想到了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,要确保这个名字在改文件内为唯一的这样才能方便我们后面替换!!
2022-06-01T05:31:05.png

  • 在启动脚本文件内使用正则表达式进行环境变量替换
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时尽量遵循规则,避免重复多层,因为每一条命令在构建时就会新增一层,层数越大镜像自然也就越大!
2022-06-01T05:41:18.png

  • 启动容器

    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里面的默认值。
我们进去容器看下效果:

2022-06-01T05:43:59.png

docker exec -it adb67edebffd /bin/bash

2022-06-01T05:46:16.png
可以看到配置项已经更改,这样就可以解决我们在不同服务器上使用同一套镜像了,避免了频繁修改配置参数重复打包的工作!

0

评论

博主关闭了当前页面的评论