首页 > 解决方案 > Openshift 4 ConfigMap 二进制文件挂载为目录

问题描述

我从 Openshift 4 Windows 10 CLI 创建了 ConfigMap:

.\oc create configmap my-cacerts --from-file=cacerts

我可以看到名为my-cacerts 的ConfigMap 并使用 Openshift 4 的 Web 界面从中下载二进制文件cacerts

现在我挂载它(my-deployment.yaml的一部分)

containers:
  volumeMounts:
    - name: my-cacerts-volume
      mountPath: /etc/my/cacerts
volumes:
  - name: my-cacerts-volume
    config-map: 
      name: my-cacerts

不幸的是/etc/my/cacerts被挂载为一个空文件夹,而不是单个二进制文件。

如何将cacerts挂载为文件而不是目录?

更新:

如果我发出

.\oc get configmap my-cacerts

有以下输出:

apiVersion: v1
binaryData:
  cacerts: ... big long base64...
kind: ConfigMap
metadata: ...

如果我发出

.\oc describe pod my-pod

我明白了

Volumes:
  my-cacerts-volume:
    Type: EmptyDir (a temporary directory that shares a pod's lifetime)

标签: kubernetesopenshiftconfigmap

解决方案


您的volumes定义不正确,config-map 不存在且无效,但似乎 API 正在默默地退回到EmptyDir此处,从而导致目录为空。

当您ConfigMap使用oc上面的命令创建一个时,结果将是ConfigMap这样的(注意有一个名为“cacerts”的键):

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-cacerts
data:
  cacerts: |
    Hello world!

在该volumes部分中,然后使用configMap:以下subPath方式从您的以下仅安装一个密钥(“cacerts”)ConfigMap

$ oc edit deployment my-deployment
[..]
    spec:
      containers:
      - image: registry.fedoraproject.org/fedora-minimal:33
        name: fedora-minimal
        volumeMounts:
        - mountPath: /etc/my/cacerts
          name: my-cacerts-volume
          subPath: cacerts
[..]
      volumes:
      - configMap:
          name: my-cacerts
          defaultMode: 420
        name: my-cacerts-volume

这将导致:

$ oc rsh ...
sh-5.0$ ls -l /etc/my/cacerts
-rw-r--r--. 1 root 1000590000 13 Dec  3 19:11 /etc/my/cacerts
sh-5.0$ cat /etc/my/cacerts
Hello world!

您也可以subPath省略并设置/etc/my/为相同结果的目标,因为每个键都会有一个文件:

[..]
        volumeMounts:
        - mountPath: /etc/my/
          name: my-cacerts-volume
[..]
      volumes:
      - configMap:
          name: my-cacerts
        name: my-cacerts-volume

对于正确的语法,您还可以查看文档


推荐阅读