Openshift 4 ConfigMap 二进制文件挂载为目录
Openshift 4 ConfigMap binary file is mounted as directory
我已经从 Openshift 4 创建了 ConfigMap Windows 10 CLI:
.\oc create configmap my-cacerts --from-file=cacerts
我可以看到名为 my-cacerts 的 ConfigMap 并使用 Openshift 4[=16] 的 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
,从而导致一个空目录。
当您使用上面的 oc
命令创建 ConfigMap
时,结果将是一个 ConfigMap
,看起来像这样(请注意,有一个名为“cacerts”的密钥) :
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cacerts
data:
cacerts: |
Hello world!
在 volumes
部分,然后使用 configMap:
和 subPath
如下所示从您的 ConfigMap
安装一个密钥(“cacerts”):
$ 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
对于正确的语法,您还可以检查the documentation
对于 Openshift 4 defaultMode 应指定:
volumeMounts:
- mountPath: /etc/my
name: cacerts-ref
readOnly: true
volumes:
- name: cacerts-ref
configMap:
defaultMode: 420
name: cacerts
之后 configMap 内容被正确映射。
.\oc describe pod my-pod
Volumes:
cacerts-ref:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: cacerts
Optional: false
我已经从 Openshift 4 创建了 ConfigMap Windows 10 CLI:
.\oc create configmap my-cacerts --from-file=cacerts
我可以看到名为 my-cacerts 的 ConfigMap 并使用 Openshift 4[=16] 的 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
,从而导致一个空目录。
当您使用上面的 oc
命令创建 ConfigMap
时,结果将是一个 ConfigMap
,看起来像这样(请注意,有一个名为“cacerts”的密钥) :
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cacerts
data:
cacerts: |
Hello world!
在 volumes
部分,然后使用 configMap:
和 subPath
如下所示从您的 ConfigMap
安装一个密钥(“cacerts”):
$ 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
对于正确的语法,您还可以检查the documentation
对于 Openshift 4 defaultMode 应指定:
volumeMounts:
- mountPath: /etc/my
name: cacerts-ref
readOnly: true
volumes:
- name: cacerts-ref
configMap:
defaultMode: 420
name: cacerts
之后 configMap 内容被正确映射。
.\oc describe pod my-pod
Volumes:
cacerts-ref:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: cacerts
Optional: false