使用自定义上下文 url 作为环境变量在 minikube 中启动 spring boot
Start sprinboot in minkube with custom context url as environnement variable
我有一个 spring 启动应用程序,我想将其部署在 Kubernetes 上(我正在使用 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 容器无法启动,这里是 spring 抛出的异常:
Initialization of bean failed; nested exception is
java.lang.IllegalArgumentException: ContextPath must start with '/'
and not end with '/'
看起来您想要的是容器规范中定义的 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
利用configmaps.
configmap 将包含您的 springboot 应用程序的 application.properties。
---
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 中引用此配置映射。
---
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
注意: 这里我们在 /config
文件夹中的 springboot 应用程序容器中安装 configmap。 --spring.config.additional-location=/config/application-dev.properties
也指向 application.properties 配置文件。
将来如果您想添加任何新配置或更新现有配置的值,只需在 configmap 和 kubectl apply
中进行更改。然后为了反映这些新的配置更改,只需缩小和扩大部署。
希望对您有所帮助。
终于找到解决方法了
我通过在 application.properties:
中添加以下行,将我的应用程序配置为使用从环境变量中获取的上下文路径值启动
server.servlet.context-path=${ESSE_APPLICATION_CONTEXT}
其余部分保持原样,这意味着我正在给出变量的值 ESSE_APPLICATION_CONTEXT 抛出配置
env:
- name: ESSE_APPLICATION_CONTEXT
value: /esse-1
然后启动应用程序 没有 --server.servlet.context-path 参数,这意味着:
java -jar app.war
注意:正如@mchawre 的回答所指出的,也可以使用 Kubernetes 文档中记录的 ConfigMap。
我有一个 spring 启动应用程序,我想将其部署在 Kubernetes 上(我正在使用 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 容器无法启动,这里是 spring 抛出的异常:
Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: ContextPath must start with '/' and not end with '/'
看起来您想要的是容器规范中定义的 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
利用configmaps.
configmap 将包含您的 springboot 应用程序的 application.properties。
---
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 中引用此配置映射。
---
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
注意: 这里我们在 /config
文件夹中的 springboot 应用程序容器中安装 configmap。 --spring.config.additional-location=/config/application-dev.properties
也指向 application.properties 配置文件。
将来如果您想添加任何新配置或更新现有配置的值,只需在 configmap 和 kubectl apply
中进行更改。然后为了反映这些新的配置更改,只需缩小和扩大部署。
希望对您有所帮助。
终于找到解决方法了
我通过在 application.properties:
中添加以下行,将我的应用程序配置为使用从环境变量中获取的上下文路径值启动server.servlet.context-path=${ESSE_APPLICATION_CONTEXT}
其余部分保持原样,这意味着我正在给出变量的值 ESSE_APPLICATION_CONTEXT 抛出配置
env:
- name: ESSE_APPLICATION_CONTEXT
value: /esse-1
然后启动应用程序 没有 --server.servlet.context-path 参数,这意味着:
java -jar app.war
注意:正如@mchawre 的回答所指出的,也可以使用 Kubernetes 文档中记录的 ConfigMap。