用自定义上下文URL作为环境变量启动Sprinboot



我有一个我想在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

最新更新