我有一个我想在kubernetes上部署的Springboot应用程序(我正在使用Minikube(,并具有从环境变量中获取的自定义上下文路径。
我已经编译了一个app.war文件。在Linux中导出环境变量如下:
export SERVER_SERVLET_CONTEXT_PATH=/app
然后在我的计算机上启动我的应用,如下:
java -jar app.war --server.servlet.context-path=$(printenv CONTEXT_PATH)
它可以按预期工作,我可以使用url localhost访问我的应用程序浏览器:8080/app/
我想在Minikube上实现同一件事,因此我准备了这些配置文件:
-
dockerfile:
FROM openjdk:8 ADD app.war app.war EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.war", "--server.servlet.context-path=$(printenv CONTEXT_PATH)"]
-
部署配置文件:
apiVersion: apps/v1 kind: Deployment metadata: name: esse-deployment-1 labels: app: esse-1 spec: replicas: 1 selector: matchLabels: app: esse-1 template: metadata: labels: app: esse-1 spec: containers: - image: mysql:5.7 name: esse-datasource ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: root - image: esse-application name: esse-app imagePullPolicy: Never ports: - containerPort: 8080 env: - name: server.servlet.context-path value: /esse-1 volumes: - name: esse-1-mysql-persistent-storage persistentVolumeClaim: claimName: mysql-persistent-storage-claim --- apiVersion: v1 kind: Service metadata: name: esse-service-1 labels: app: esse-1 spec: selector: app: esse-1 ports: - protocol: TCP port: 8080 targetPort: 8080 type: NodePort
但是,POD内的Java容器无法启动,这是春季的例外:
豆的初始化失败;嵌套异常是 java.lang.illegalargumentException:上下文路径必须以'/'开头 而不是以'/'
结尾
使用configmaps。
ConfigMap将容纳应用程序。
---
apiVersion: v1
kind: ConfigMap
metadata:
name: esse-config
data:
application-dev.properties: |
spring.application.name=my-esse-service
server.port=8080
server.servlet.context-path=/esse-1
注意:
server.servlet.context-path=/esse-1
将覆盖您的Springboot应用程序的上下文路径。
现在,请参阅部署yaml中的此configmap。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: esse-deployment-1
labels:
app: esse-1
spec:
replicas: 1
selector:
matchLabels:
app: esse-1
template:
metadata:
labels:
app: esse-1
spec:
containers:
- image: mysql:5.7
name: esse-datasource
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- image: esse-application
name: esse-app
imagePullPolicy: Never
command: [ "java", "-jar", "app.war", "--spring.config.additional-location=/config/application-dev.properties" ]
ports:
- containerPort: 8080
volumeMounts:
- name: esse-application-config
mountPath: "/config"
readOnly: true
volumes:
- name: esse-application-config
configMap:
name: esse-config
items:
- key: application-dev.properties
path: application-dev.properties
- name: esse-1-mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-persistent-storage-claim
注意:在这里,我们将ConfigMap安装在您的Springboot应用程序容器中,请在/config
文件夹中。 --spring.config.additional-location=/config/application-dev.properties
也指向application.properties配置文件。
将来,如果要添加任何新的配置或更新现有配置的值,这只会使ConfigMap和kubectl apply
IT更改。然后,要反映那些新的配置更改,只需缩小并扩大部署。
希望这会有所帮助。
最后,我找到了一个解决方案。
我将应用程序配置为启动,并通过在我的应用程序中添加此行,并通过从环境变量获取的上下文路径的值。
server.servlet.context-path=${ESSE_APPLICATION_CONTEXT}
,其余的仍然如此,这意味着我要给予变量esse_application_context的值
env:
- name: ESSE_APPLICATION_CONTEXT
value: /esse-1
然后启动应用程序没有 - server.servlet.context-path pamameeter,这意味着:
java -jar app.war
注意:正如 @mchawre的答案所指出的那样,也可以使用kubernetes docs中记录的configmap。
看起来您想要的是容器规范中定义的SERVER_SERVLET_CONTEXT_PATH
变量:
apiVersion: apps/v1
kind: Deployment
metadata:
name: esse-deployment-1
labels:
app: esse-1
spec:
replicas: 1
selector:
matchLabels:
app: esse-1
template:
metadata:
labels:
app: esse-1
spec:
containers:
- image: mysql:5.7
name: esse-datasource
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- image: esse-application
name: esse-app
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: SERVER_SERVLET_CONTEXT_PATH <== HERE
value: /esse-1
volumes:
- name: esse-1-mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-persistent-storage-claim
请注意,在您的POD规格中,您在本地设置时使用/esse-1
,您的/app