1. 直接启动jar包
1.2 指定jar包内配置文件
做这个的前提是你打jar包时里面就包含了不同环境配置的配置文件,主要的问题在于用-Dspring.profiles.active
还是--spring.profiles.active=dev
,这两个使用上有区别。
命令:
java -jar -Dspring.profiles.active=dev {your jar}.jar
-Dspring.profiles.active=dev
如果放到后面,无效,但是不会报错,此时加载的就是打包时预设置的配置文件。
或者命令:
java -jar {your jar}.jar --spring.profiles.active=dev
--spring.profiles.active=dev
如果放到前面,直接报错。
目前发现一个特例,Dockerfile里面使用ENTRYPOINT时-Dspring.profiles.active=dev
不讲究位置在哪,使用CMD时不行。
1.2 直接指定配置文件,不使用jar包内置的配置文件
这个其实和上面的类似。
命令:
java -jar {your jar}.jar --spring.config.location={file path}
或者命令:
java -jar -Dspring.config.location={file path} {your jar}.jar
2. 用容器运行jar包打成的镜像
2.1 套用1的方法
无论是在docker的CMD、ENTRYPOINT还是k8s的command命令中,都可以按照1.1的做法直接写命令。
这里还需要注意一点,ENTRYPOINT中可以直接执行java命令,CMD和command命令则需要写/bin/sh -c java
,因为使用的基础镜像不同,有的可能需要使用/bin/bash。
如果需要1.2的做法,那么可以有两种选择:
1. 打包镜像时直接把配置文件放到镜像中,这样每个环境都要单独打镜像,麻烦;
2. 如果是只使用docker,可以把配置文件写好放在宿主机或者nfs等,然后直接挂载到容器中,启动时指定使用哪那个配置文件,这样就不用每次修改镜像;如果使用的是k8s,因为宿主机和pod通常都不是绑定的,所以只能把配置文件放到nfs这些共享文件系统中。
这里要注意一下springboot读取配置文件的位置有如下优先级,依次降低:
1. 在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下。
2. 直接把配置文件放到jar包的同级目录。
3. 在classpath下建一个config文件夹,然后把配置文件放进去。
4. 在classpath下直接放配置文件。
优先级最高的时命令行中指定的配置文件。
2.2 k8s使用包含配置文件的configmap
2.1的做法的缺点是需要额外使用nfs之类的文件来保存配置文件,通过configmap可以把配置文件直接交给k8s来管理。
如果不需要k8s或者对k8s的yaml脚本没有了解,下面的就不需要看了。
写一个创建configmap的脚本:
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
namespace: test-namespace
data:
application.properties: |
server.port=8080
server.servlet.context-path=/test-srv
application-dev.properties: |
server.port=8081
server.servlet.context-path=/test-srv
这样就在test-namespace下的test-configmap里面创建了一个文件,文件名叫做application.properties,文件内容就是|
后面的内容。这样的文件可以创建多个,例如在下面继续写的application-dev.properties。
在k8s的Deployment脚本中,可以用上面的文件来创建一个volume,例如命名为config-volume:
volumes:
- name: config-volume
configMap:
name: notify-configmap
在Deployment脚本中使用:
volumeMounts:
- name: config-volume
mountPath: {容器挂载的目录1}
subPath: application.properties
- name: config-volume
mountPath: {容器挂载的目录2}
subPath: application-dev.properties
上面的文件就挂载到了容器中,这样在启动jar包的时候就可以指定使用这些文件了。
容器处理的顺序时先挂载目录,后执行启动命令。
网友评论