kubernetes - 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)
解决方案
您的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
对于正确的语法,您还可以查看文档
推荐阅读
- php - 服务器端应用程序许可证
- azure - Web/Worker 角色重启重置防火墙规则
- java - 运行时 MQ 和 Java 版本不匹配问题
- angular - Angular 2+ - 如何模拟用于环境变量的常量类
- xcode - 如何在 xcode 10 上创建胖二进制文件
- c# - WEB.API 不会在 POST 方法中反序列化传入的 JSON
- unix - Unix cut命令从右侧后第二个分隔符的左侧提取字符串
- python-3.x - 如何解决 Python 3 的最大字符串大小?
- c++ - 如何将 string.erase() 与指针一起使用?
- java - Jhipster jdl 中的自定义数字