原理:根据SpringBoot加载配置文件的顺序,可将外部的/config/自定义文件挂载到容器内的同jar路径下,启动docker时,读取外部自定义配置

方法:

1.读取jar包同目录下/config/sensorJson.json文件

public static String readJsonFile() {
        //String filePath = "src/main/resources/sensorJson.json"; //读取jar包内的sensorJson.json文件
        String filePath = "config/sensorJson.json";  //读取同jar包目录下/config/sensorJson.json文件
        String jsonStr = "";
        try {
            File jsonFile = new File(filePath);
            Reader reader = new InputStreamReader(new FileInputStream(jsonFile), StandardCharsets.UTF_8);
            int ch = 0;
            StringBuilder sb = new StringBuilder();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }
            reader.close();
            jsonStr = sb.toString();
            return jsonStr;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

2.打包成jar后,在同目录下创建/config/sensorJson.json,执行java -jar 项目.jar 测试读取外部文件是否生效

3.打成镜像运行

  1)将项目.jar放在Docker服务器上

     目录为:/home/docker/项目.jar

  2)同目录创建文件夹: makir /home/docker/config

  3)将sensorJson.json文件放到/home/docker/config下

  4)编辑Dockerfile文件,并上传到服务/home/docker路径下

Dockerfile文件:

# 基础镜像
FROM openjdk:8-jre
# author 作者
MAINTAINER ZJH

# 挂载目录,宿主机目录,我这里是jar包目录
VOLUME /home/docker
# 指定路径,docker容器里jar包的目录
WORKDIR /home/docker

# 添加jar到镜像并命名为test.jar
ADD upDataServer-1.0-SNAPSHOT.jar upDataServer.jar
#在docker容器里创建和宿主机同样的配置文件的目录, jar包要和config目录同级
CMD mkdir /home/docker/config

# 启动服务
ENTRYPOINT ["java","-jar","upDataServer.jar"]

   5)执行docker打包命令

    docker build -t updataserver .

    注意!镜像名称必须为小写

  6)运行docker run -d -p 45803:45803 -v /home/docker/config:/home/docker/config --name updataserver --restart=always updataserver

    -d : 后台运行
    -p : 映射出去的端口 :容器启动jar包的端口
    -v : 宿主机目录:docker容器里的目录
    –name : 启动镜像时容器的名字
    –restart : 开机重启
    updataserver :镜像的名字

4.修改配置文件后,docker restart updataserver 重启镜像,读取了修改后的配置文件

补充:

保存镜像
docker save -o updataserver.tar updataserver
加载镜像
docker load -i updataserver.tar

Spring.jar加载配置文件的顺序

同一位置下,Properties 文件优先级高于 YAML 文件

1.Jar包同目录/config/自定义/appliction-{profile}.properties/yml

2.Jar包同目录/config/自定义/appliction.properties/yml

3.Jar包同目录/config/appliction-{profile}.properties/yml

4.Jar包同目录/config/appliction.properties/yml

5.Jar包同目录appliction-{profile}.properties/yml

6.Jar包同目录appliction.properties/yml

7.Jar包中的/resources/config/appliction-{profile}.properties/yml

8.Jar包中的/resources/config/appliction.properties/yml

9.Jar包中的/resources/appliction-{profile}.properties/yml

10.Jar包中的/resources/appliction.properties/yml

并且遵从以下原则:

1、先加载 JAR 包外的配置文件,再加载 JAR 包内的配置文件;
2、先加载 config 目录内的配置文件,再加载 config 目录外的配置文件;
3、先加载 config 子目录下的配置文件,再加载 config 目录下的配置文件;
4、先加载 appliction-{profile}.properties/yml,再加载application.properties/yml;
5、先加载 .properties 文件,再加载 .yml 文件。