应用jar里的配置文件比较多,但是又不规范
比如,我面对的一个jar文件要从单体部署到高可用中,所以我需要用命令来替换一些配置,本以为是比较简单的步骤,但是却踩了很多坑.

比较明显的就是使用--spring.profiles.active=distributed,如果这样启动jar,配置文件xxx-docker会生效,但是jar中的application.properties就会失效,这并不是我想要的效果,我只是想替换bootstrap-xx.yml这个配置文件
jar里的配置文件是这样的:

[root@localhost SecDesk]# ls -alhr testjar/BOOT-INF/classes/
total 88K
drwxr-xr-x.  7 root root   78 Sep  6 17:36 WEB-INF
drwxr-xr-x.  3 root root   28 Sep  6 17:36 RuleRepository
drwxr-xr-x.  4 root root   47 Sep  6 17:36 pe
-rw-r--r--.  1 root root 9.2K Sep  6 17:36 filebeat-config.yml
-rw-r--r--.  1 root root  847 Sep  6 17:36 ehcache.xml
drwxr-xr-x.  2 root root 4.0K Sep  6 17:36 config
drwxr-xr-x.  3 root root   21 Sep  6 17:36 com
drwxr-xr-x. 15 root root  227 Sep  6 17:36 client
-rw-r--r--.  1 root root   41 Sep  6 17:36 bootstrap.yml.bak
-rw-r--r--.  1 root root   40 Sep  6 17:36 bootstrap.yml
drwxr-xr-x.  2 root root 4.0K Sep  6 17:36 bootstrap-undertow
-rw-r--r--.  1 root root 5.5K Sep  6 17:36 bootstrap-docker.yml.bak
-rw-r--r--.  1 root root 5.5K Sep  6 17:36 bootstrap-docker.yml
-rw-r--r--.  1 root root 5.1K Sep  6 17:36 bootstrap-dev.yml
-rw-r--r--.  1 root root 7.3K Sep  6 17:36 bootstrap-dev-dd.yml
-rw-r--r--.  1 root root 5.9K Sep  6 17:36 bootstrap-combine.yml
-rw-r--r--.  1 root root  458 Sep  6 17:36 banner.txt.bak
-rw-r--r--.  1 root root   59 Sep  6 17:36 banner.txt
drwxr-xr-x.  3 root root   17 Sep  6 17:36 arrange
-rw-r--r--.  1 root root 3.2K Sep  6 17:37 application.properties
drwxr-xr-x.  4 root root   71 Sep  6 17:37 ..
drwxr-xr-x. 10 root root 4.0K Sep  6 17:37 .

如果我在docker-compose文件中这么搞的话,就会有问题,application.properties就会失效,因为jar里面的application.properties有比较重要的配置,我这么做之后报错了,所以才发现这个问题

    server-client:
      entrypoint: [ "java", "-jar", "/server-client.jar","--spring.config.location=/config/bootstrap-distributed.yml" ,"--spring.profiles.active=distributed"]
      volumes:
        - ./server-client/bootstrap-distributed.yml:/config/bootstrap-distributed.yml
      depends_on:
        - consul
解决的办法

使用--spring.config.additional-location指定一个配置文件夹,这样的话不影响jar里的配置文件,然后把jar里面的bootstrap.yml复制出来放到/config/文件夹里
然后修改bootstrap.yml的内容,把bootstrap也挂载到容器中去,这样jar里原来的配置文件就能按原来的顺序加载了,就能达到目的了

本来我打算如果这样还不好使的话,就把jar里面的配置文件都考出来,放到config目录去,然后直接挂载目录

entrypoint: [ "java", "-jar", "/server-client.jar","--spring.config.additional-location=/config/" ]
bootstrap.yml的内容.
spring:
  profiles:
    active: docker # 改成 distributed
修改后的compose配置
server-client:
      entrypoint: [ "java", "-jar", "/server-client.jar","--spring.config.additional-location=/config/" ]
      volumes:
        - ./server-client/bootstrap-distributed.yml:/config/bootstrap-distributed.yml
        - ./server-client/bootstrap.yml:/config/bootstrap.yml
      depends_on:
        - consul
      container_name: server-client
      image: server-client
      restart: always
      networks:
        - sec-net
      ports:
        - 32084:32084
        - 8228:8228
      environment:
....

王迪
3 声望0 粉丝