前言:
一般来说,springboot打成的jar运行时,同目录/config目录下放application.yml文件会被进行加载,然后通过设置docker映射出宿主机即可做到配置文件外配的效果,但很多时候别的配置文件做不到这种效果,说一种较为极端的例子,对接定制化开发时,需要引入客户定制化的jar包,此时,jar包中的代码强制指定resources目录下对应它的配置文件,那么我们外提了配置,制定化的jar包中就无法获取到该配置文件了。此时,如果我们用docker进行部署(jar直接执行其实按下面步骤也是可以的),可以采用dockerfile来实现相关外提
一、了解jar的相关命令
jar -uvf /mqtt-transfer.jar /BOOT-INF/classes/iotagent.properties
该命令的意思是:将/BOOT-INF/classes/iotagent.properties的文件更新到mqtt-transfer.jar对应解压后/BOOT-INF/classes/iotagent.properties中
注意:/BOOT-INF/classes/iotagent.properties不仅仅指代jar包中的目录,还指代当前文件的目录文件
/BOOT-INF/classes/目录就是对应resources目录下的配置文件所在位置
相信你此时已经有了思路,如果我们只是通过java -jar来运行项目,那么想要外提配置,让配置生效,可以先将需要外提的配置文件放到/BOOT-INF/classes/目录下(window系统随便一个盘在根目录创建/BOOT-INF/classes/即可),然后执行jar -uvf 命令即可
二、对于docker部署配置外提
做一些前置操作,dockerfile内容如下:
# 该镜像需要依赖的基础镜像
FROM openjdk:8-jdk-alpine
# 声明服务运行在9300端口
EXPOSE 9300
# 将target目录下的jar包复制到docker容器的/目录下
ADD ./target/mqtt-transfer.jar mqtt-transfer.jar
# 指定临时文件目录
VOLUME /tmp
# 项目配置的日志文件目录
VOLUME /logs
# 项目配置的config目录
VOLUME /config
# 将当前目录下的setup.sh复制到docker容器的/目录下
ADD ./setup.sh setup.sh
# 指定docker容器启动时运行
ENTRYPOINT ["sh", "/setup.sh"]
# 指定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 指定维护者的名字
MAINTAINER henyi
我的项目是采用jdk8运行,具体根据项目配置
这里需要关注的是ENTRYPOINT ["sh", "/setup.sh"]这个命令,该命令是容器只要每次启动,都会执行setup.sh脚本
setup.sh脚本如下:
#!/bin/bash
jar -uvf /mqtt-transfer.jar /BOOT-INF/classes/iotagent.properties
java -jar /mqtt-transfer.jar
此时,我们已经完成了项目配置外提,dockerfile创建了镜像后,创建容器时我们还需要映射一下文件目录,因为此时我们只是把项目相关的配置放到了容器里,需要映射到宿主机目录
docker run -d -p 9300:9300 \
-v /home/logs:/logs \
-v /home/tmp:/tmp \
-v /home/config:/config \
-v /home/iotagent.properties:/BOOT-INF/classes/iotagent.properties \
--name=mqtt-transfer --restart=always 创建的镜像id
相关的映射我们都映射到了home目录,执行命令之前先在对应的目录创建好配置文件,启动即可