gpt4 book ai didi

java - Dockerized Spring Boot 应用程序不使用挂载的 Kubernetes ConfigMap (application.properties)

转载 作者:行者123 更新时间:2023-12-02 11:43:05 24 4
gpt4 key购买 nike

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

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

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

看来Spring Boot使用的是第一个application.properties当 k8s 覆盖它时,显然它不使用它。

看来,显然,发生的事情是:

  • 在 Dockerized Spring Boot 应用程序中运行 .jar 文件
  • 使用第一个/默认application.properties运行时文件
  • Kubernetes 继续挂载 configMap
  • mount/overwrite 成功,但是 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

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

    最佳答案

    问题是/src/main/resources/application.properties默认情况下,您的应用程序使用的是 jar 文件中的那个。如果你打开你的 jar ,你应该在那里看到它。
    话虽如此,您对安装 /src/main/resources 的期望不幸的是,您的 jar 所在的目录将无法实现。
    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

    希望有所帮助,

    干杯!

    关于java - Dockerized Spring Boot 应用程序不使用挂载的 Kubernetes ConfigMap (application.properties),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59187918/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com