我有一个问题,在我的Dockerized Spring Boot应用程序中没有使用我存储在application.properties
中的configMap
。
但是,当我进入Pod的外壳时,我可以看到并确认configMap
已正确安装在Spring Boot应用程序的正确目录中。
注意,默认情况下我有一个application.properties
,其中Kubernetes稍后会挂载/覆盖它。
[似乎Spring Boot使用第一个application.properties
,并且当k8s覆盖它时,显然,它没有使用它。
显然,发生的事情是:
application.properties
文件configMap
这是我的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
目录。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
希望有所帮助,
干杯!