【发布时间】:2020-03-29 22:59:50
【问题描述】:
我有一个问题,在我的 dockerized Spring Boot 应用程序中没有使用我存储在 configMap 中的 application.properties。
但是,当我进入 Pod 的 shell 时,我可以看到并确认我的 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
非常感谢任何帮助...非常感谢您.. :)
【问题讨论】:
-
只是想知道:a) 您是否尝试过仅使用目录作为挂载? IE。
/usr/src/my-project/my-project-service/src/main/resources/config/? b) 您是否可以不提供默认的application.properties? c) 您是否考虑/尝试过 K8s 中lifecycle中的postStart挂钩来运行您的应用程序?而不是通过Dockerfile进行。如果是这样,您是否看到应用读取正确配置的任何变化? -
嗨@KenFlake,我在stackoverflow 上找到了这个post,它可能会回答你的问题。让我知道是否有帮助。
-
嗨@yvesonline,您是否有一个示例代码sn-p 可以使用
postStart在k8s 部署文件中运行.jar 文件?因为不知道长什么样子,只知道在Dockerfile里面运行.jar文件=) -
您好@jt97,我已经查看了您的建议,非常感谢您的回复。但正如我所看到的,我看到 SO 帖子和我的 Dockerfile 配置非常相似。我不知道在我的 Dockerfile 版本上编辑什么... =)
-
您可以在 kubernetes.io/docs/tasks/configure-pod-container/… 中阅读有关它的信息,并在您的
deployment.yaml中进行操作,将类似于lifecycle: postStart: exec: command: ...的内容添加到您的容器规范中。确保不要在您的Dockerfile中启动您的应用程序,然后让容器在那里闲置。
标签: java spring spring-boot docker kubernetes