当前位置: 首页 > news >正文

dockerfile暴力处理配置文件外提

前言:

一般来说,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.propertiesjava -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目录,执行命令之前先在对应的目录创建好配置文件,启动即可

http://www.lryc.cn/news/66499.html

相关文章:

  • 如何快速给出解释——正交矩阵子矩阵的特征值的模必然不大于1
  • c语言-位运算
  • 【Android学习专题】安卓样式学习(学习内容记录)
  • 普罗米修斯统计信息上报结构设计
  • 两个系统之间的传值
  • PostgreSQL(五)JDBC连接串常用参数
  • 如何修改浏览器中导航栏的背景色和字体
  • 如何选择合适的智能氮气柜?
  • 双向链表(数据结构)(C语言)
  • 离线安装Percona
  • 界面控件Telerik UI for WinForms使用指南 - 数据绑定 填充(二)
  • 通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器
  • leetcode 704. 二分查找
  • 蓝牙耳机什么牌子好?500内好用的蓝牙耳机推荐
  • 设计模式 -- 中介者模式
  • 人工智能的未来之路:语音识别的应用与挑战
  • c++ 友元介绍
  • 四维轻云地理空间数据在线管理软件能够在线管理哪些数据?
  • 学习 GitHub 对我们有什么好处?
  • java记录-反射
  • 这次彻底不需要账号了,无需魔法永久白嫖GPT
  • 远程桌面连接是什么?如何开启远程桌面连接详细教程
  • lua实战(2)
  • UI自动化测试案例——简单的Google搜索测试
  • C++之虚函数原理
  • Windows Information Protection(WIP)部署方案
  • 细说Hibernate的缓存机制
  • 初识C++之线程库
  • ChatGLM-LLaMA-chinese-insturct 学习记录(含LoRA的源码理解)
  • JuiceFS-K8s部署