如何使用 Configmap 构建映像

问题描述

我正在努力简化我们的部署过程。目前,我们为 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