使用自定义上下文 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 上实现同样的事情,所以我准备了这些配置文件:



但是,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。