Dockerized Spring Boot应用未使用已安装的Kubernetes ConfigMap(application.properties)

问题描述 投票:2回答:1

我有一个问题,在我的Dockerized Spring Boot应用程序中没有使用我存储在application.properties中的configMap

但是,当我进入Pod的外壳时,我可以看到并确认configMap已正确安装在Spring Boot应用程序的正确目录中。

注意,默认情况下我有一个application.properties,其中Kubernetes稍后会挂载/覆盖它。

[似乎Spring Boot使用第一个application.properties,并且当k8s覆盖它时,显然,它没有使用它。

显然,发生的事情是:

  • 在Dockerized Spring Boot应用程序内运行.jar文件
  • 在运行时使用第一个/默认的application.properties文件
  • Kubernetes继续安装configMap
  • 装载/覆盖成功,但是由于Spring Boot已经在运行,它将如何使用它?

这是我的Spring Boot / Docker映像的Dockerfile供参考:

FROM maven:3.5.4-jdk-8-alpine

# Copy whole source code to the docker image
# Note of .dockerignore, this ensures that folders such as `target` is not copied
WORKDIR /usr/src/myproject
COPY . /usr/src/myproject/

RUN mvn clean package -DskipTests

WORKDIR /usr/src/my-project-app
RUN cp /usr/src/myproject/target/*.jar ./my-project-app.jar
EXPOSE 8080
CMD ["java", "-jar", "my-project-app.jar"]

这是我的Kubernetes部署.yaml文件供参考:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-project-api
  namespace: my-cluster
  labels:
    app: my-project-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-project-api
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: my-project-api
    spec:
      containers:
        - name: my-project-api
          image: "my-project:latest"
          imagePullPolicy: Always
          env:
            .
            .
            .
          volumeMounts:
          - name: my-project-config
            mountPath: /usr/src/my-project/my-project-service/src/main/resources/config/application.properties
          ports:
            - containerPort: 8080
              name: my-project-api
              protocol: TCP
      volumes:
        # Name of the volume
        - name: my-project-config
          # Get a ConfigMap with this name and attach to this volume
          configMap:
            name: my-project-config

还有我的configMap供参考:

kind: ConfigMap
apiVersion: v1
data:
  application.properties: |-
    # This comment means that this is coming from k8s ConfigMap. Nice!
    server.port=8999
    .
    .
    .
    .

metadata:
  name: my-project-config
  namespace: my-cluster

非常感谢任何帮助...非常感谢..:)

java spring spring-boot docker kubernetes
1个回答
1
投票

事实是,您的应用程序使用的/src/main/resources/application.properties默认是jar文件中的那个。如果您打开罐子,应该在那里看到它。话虽这么说,不幸的是,您的期望是无法安装jar所在的/src/main/resources目录。These are the docs you should be looking at

我不会详细介绍它,因为它在文档中作了很好的解释,但我会说,最好是显式声明您的配置位置,以便项目中的新人们知道配置来自何处。蝙蝠。

您可以执行以下操作:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-project-api
  labels:
    app: my-project-api
spec:
  selector:
    matchLabels:
      app: my-project-api
  template:
    metadata:
      labels:
        app: my-project-api
    spec:
      containers:
        - name: my-project-api
          image: "my-project:latest"
          imagePullPolicy: Always
          env:
            - name: JAVA_OPTS
              value: "-Dspring.config.location=/opt/config"
            .
            .
            .
          volumeMounts:
            - name: my-project-config
              mountPath: /opt/config
          ports:
            - containerPort: 8080
      volumes:
        - name: my-project-config
          configMap:
            name: my-project-config

希望有所帮助,

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.