问题描述
我正在努力简化我们的部署过程。目前,我们为 Spring Boot 应用程序构建了一个 jar 文件,然后使用以下 DockerFile 构建一个镜像。
FROM [DTRServer]/java/javaimage_mmddyyyy:8
EXPOSE 8080
copY /conf/myapp-conf.yaml /etc/k8t/myapp-conf.yaml
ADD target/myapp_mmddyyyy.jar myapp.jar
ENTRYPOINT ["java","-jar","myapp.jar","--spring.config.location=/etc/k8t/myapp-conf.yaml"]
在我们的 k8t 中,我们创建了一个 Configmap(app-config)。所以我们的 deployment.yaml 就像
containers:
- image: [DTRServer]/projectname/myappimage:0.2.4-43
imagePullPolicy: Always
name: myapp
ports:
- containerPort: 8080
volumeMounts:
- name: myapp-conf
mountPath: /etc/k8t/
volumes:
- name: myapp-conf
configMap:
name: myapp-conf
为什么构建时需要在Dockerfile中指定spring.config.location?我们将使用 Configmap。所以我从 Dockerfile 和 deployment.yaml 中删除了配置文件信息。
FROM [DTRServer]/java/javaimage_mmddyyyy:8
EXPOSE 8080
ADD target/myapp_mmddyyyy.jar myapp.jar
ENTRYPOINT ["java","myapp.jar"]
containers:
- image: [DTRServer]/projectname/myappimage:0.2.4-43
imagePullPolicy: Always
name: myapp
ports:
- containerPort: 8080
volumes:
- name: myapp-conf
configMap:
name: myapp-conf
然后,pod 不喜欢它。它抱怨找不到配置值。如何在没有配置信息的情况下构建映像,并使用 Configmap 启动 Pod?
解决方法
Spring Boot 2.4 configuration tree support 可以与 Kubernetes ConfigMaps 一起使用。如果要从挂载的目录中加载多个文件,以文件名为键,内容为值,则需要使用 configtree:
前缀。 volumeMounts
部分仍然需要出现在 deployment.yml
中,以指定应安装 ConfigMap
数据的位置。 deployment.yml
看起来像这样:
containers:
- image: [DTRServer]/projectname/myappimage:0.2.4-43
imagePullPolicy: Always
name: myapp
ports:
- containerPort: 8080
volumeMounts:
- name: myapp-conf
mountPath: /etc/k8t/
env:
- name: SPRING_CONFIG_IMPORT
value: configtree:/etc/k8t/
volumes:
- name: myapp-conf
configMap:
name: myapp-conf