Docker运行Java项目挂载使用外部配置文件

前言

?你是否遇到过打包好的Java项目编译成Docker镜像,当你的配置文件需要做改动,这个时候你就需要在本地更新配置文件重新打包成Docker镜像,最常见的就是SpringBoot项目,配置文件一般都在application.yml中,如果你所做的改动非代码文件仅仅是配置文件,本文将告诉你你如何将配置文件挂载到宿主机下来快速更改配置文件,省去大量无意义的时间去打包镜像。

环境

  • ?系统:CentOS 7
  • ?Docker:20.10.10
  • ☕JDK:1.8

SpringBoot配置文件的加载路径优先级

?在讲解Docker运行Java项目挂载使用外部配置文件之前,需要了解SpringBoot的配置文件加载路径优先级~

优先级(从高到低):

  • 工程根目录:./config/
  • 工程根目录:./
  • classpath:/config/
  • classpath:/

?当Springboot打成JAR包(不包含配置文件),读取外部配置文件application.properties时,可以选择:

?1.把application.properties放在在项目名.jar的同级目录下。

?2.在项目名.jar同级目录,创建一个config文件夹,把application.properties放进去。

演示外部配置文件

?例如这里有一个SpringBoot的项目,里面的配置的默认端口是8081

?运行一下,看看端口(port)确实是8081

⛺项目目录

可以看到项目目录下当前仅仅只有一个项目jar包

☘️此时我们随便采取一种方案来让SpringBoot读取外部文件,这里演示我就是要使用方案一来演示~
?️新创建一个SpringBoot的配置文件application.properties,端口改为8888来作为测试

?将配置文件丢到项目目录下

?这个时候我们在重新运行,可以看到端口是8888,说明SpringBoot成功读取到外部配置文件

?了解完SpringBoot如何读取外部文件之后,是不是大概能想到一种方案:

?假如我们的jar包在容器app1tmp目录下,我们将tmp目录映射挂载到宿主机的tmp目录下
【也就是说:Dockerfile的入口点是ENTRYPOINT java -jar /tmp/app.jar

此时我们在宿主机的tmp目录下添加application.properties配置文件即可

?接下来测试一下这个思路是否可行~

Docker部署SpringBoot项目读取外部文件

?‍?编写Dockerfile文件

FROM java:8-alpine
ENTRYPOINT java -jar /tmp/app.jar

?提前将jar包和配置文件放置在宿主机的tmp目录中,会自动映射到容器内部的tmp目录

测试创建并运行容器【配置文件中的端口是8888,如果成功读取到控制台会显示8888

?很遗憾,这种思路对了,但是并没有起到效果~

正确配置Docker部署SpringBoot项目读取外部文件

?解决上面的办法就是在Dockerfile的入口点加上

--spring.config.additional-location=/tmp/application.properties

项⽬使⽤容器内tmp⽬录下的application.properties配置⽂件

FROM java:8-alpine
ENTRYPOINT java -jar /tmp/app.jar --spring.config.additional-location=/tmp/application.properties

此时删掉上面创建不生效的容器和镜像,使用新的Dockerfile入口点

?此时SpringBoot成功读取到外部配置文件,以后再需要修改配置文件,直接在宿主机中修改即可。

教程结束