# 挂载为文件

大部分情况下，ConfigMap定义的都是配置文件，而不是环境变量，因此需要将ConfigMap中的文件（一般为--from-file创建）挂载到Pod中，然后Pod中的容器就可以引用，此时可以<mark style="color:blue;">**通过Pod的volume字段进行挂载。**</mark>

<details>

<summary><mark style="color:purple;"><strong>名为cm-dir的ConfigMap：</strong></mark></summary>

{% code overflow="wrap" %}

```properties
$ kubectl get cm cm-dir -o yaml
apiVersion: v1
data:
  game.properties: "enemies=aliens\r\nlives=3\r\nenemies.cheat=true\r\nenemies.cheat.level=noGoodRotten\r\nsecret.code.passphrase=UUDDLRLRBABAS\r\nsecret.code.allowed=true\r\nsecret.code.lives=30"
  ui.properties: "color.good=purple\r\ncolor.bad=yellow\r\nallow.textmode=true\r\nhow.nice.to.look=fairlyNice"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T06:41:29Z"
  name: cm-dir
  namespace: default
  resourceVersion: "152782"
  uid: 0238826d-3ffb-4365-9b12-76610f4b6b31
```

{% endcode %}

在该configMap中存在两个键，分别名为**game.properties**和**ui.properties**，这两个键对应的值各自表示一个**properties文件**。

</details>

## 挂载ConfigMap中所有的文件

<mark style="color:blue;">**将名称为cm-dir的ConfigMap挂载到容器的/etc/config/目录下：**</mark>

<details>

<summary>pod-cm.yaml</summary>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'ls /etc/config']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
  restartPolicy: Never      
```

<mark style="color:blue;">**使用kubectl创建该Pod后，会执行Pod设置的command命令，即执行ls /etc/config/**</mark>

</details>

```properties
$ kubectl create -f pod-cm.yaml 
pod/dapi-test-pod created

$ kubectl get pod dapi-test-pod
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          17s

$ kubectl logs dapi-test-pod
game.properties
ui.properties
```

{% hint style="warning" %}

## <mark style="color:orange;">注意：</mark>

<mark style="color:blue;">**/etc/config/目录会被覆盖**</mark>
{% endhint %}

## 自定义文件名挂载ConfigMap

很多情况下，需要**更改挂载的文件名**，可以<mark style="color:blue;">**使用path字段指定ConfigMap挂载的文件名**</mark>，比如将game.properties挂载到/etc/config，并指定名称为keys：

<details>

<summary>pod-cm-rename.yaml</summary>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-rename
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'cat /etc/config/keys']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
        items:
          - key: game.properties
            path: keys
  restartPolicy: Never      
```

</details>

```properties
$ kubectl create -f pod-cm-rename.yaml 
pod/pod-cm-rename created

$ kubectl get pod pod-cm-rename
NAME            READY   STATUS      RESTARTS   AGE
pod-cm-rename   0/1     Completed   0          13s

$ kubectl logs pod-cm-rename
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
```

{% hint style="warning" %}

## <mark style="color:orange;">注意：</mark>

<mark style="color:orange;">**只有在items中指定的key才会被挂载**</mark>，未指定的key将不会被挂载<mark style="color:orange;">**。**</mark>
{% endhint %}

## 指定挂载的文件权限

ConfigMap在挂载使用时可以更改文件的权限（默认是0644），比如将上述的文件挂载权限自定义为0666（对应Linux的文件权限为rw-rw-rw-）：

<details>

<summary>pod-cm-rename.yaml</summary>

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm-rename
spec:
  containers:
  - name: test-container
    image: busybox
    command: ['/bin/sh', '-c', 'cat /etc/config/keys']
    volumeMounts:
      - name: config-volume
        mountPath:  /etc/config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
  volumes:
    - name: config-volume
      configMap:
        name: cm-dir
        items:
          - key: game.properties
            path: keys
        defaultMode: 0666
  restartPolicy: Never      
```

</details>

<mark style="color:blue;">**使用.configMap.defaultMode字段自定义文件权限，该权限对.configMap.items下的所有文件均生效**</mark>。

<mark style="color:blue;">**可以使用items\[].mode字段单独设置某个文件的权限**</mark>，用于不同文件的不同权限挂载。
