# 创建ConfigMap

ConfigMap可以用<mark style="color:blue;">**目录（目录下有多个文件）**</mark>、<mark style="color:blue;">**单个文件**</mark>或<mark style="color:blue;">**字符值**</mark>的方式创建，使用kubectl创建一个ConfigMap的命令格式如下：

```properties
kubectl create cm <map-name> <datasource>
```

* **map-name**：ConfigMap的名称。
* **data-source**：数据源，可以是**目录**、**文件**或**字符值**。

## 基于目录创建ConfigMap

<details>

<summary>conf文件夹</summary>

有一个conf文件夹，里面包含两个配置文件，文件内容如下：

{% code title="ui.properties" %}
```properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
```
{% endcode %}

{% code title="game.properties" %}
```properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
```
{% endcode %}

</details>

基于目录下的所有文件创建ConfigMap的命令如下：

```properties
$ kubectl create cm cm-dir --from-file=conf
configmap/cm-dir created
```

由于该ConfigMap是直接基于目录创建的，没有指定ConfigMap中的Key名，因此默认是<mark style="color:blue;">**按照目录下的文件名作为ConfigMap数据中的Key名**</mark>，查看当前创建的ConfigMap：

{% 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

<mark style="color:blue;">**在实际使用时，大部分都是基于单个文件创建ConfigMap的，然后挂载至某个资源文件供其Pod使用**</mark>。例如有一个game.properties文件，可以基于此文件使用kubectl create cm创建ConfigMap：

```properties
$ kubectl create cm cm-one-file --from-file=conf/game.properties 
configmap/cm-one-file created
```

<mark style="color:blue;">**由于没有指定ConfigMap的Key，因此依旧使用文件名作为Key**</mark>，查看当前的ConfigMap：

{% code overflow="wrap" %}
```properties
$ kubectl get cm cm-one-file -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"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T06:55:37Z"
  name: cm-one-file
  namespace: default
  resourceVersion: "153250"
  uid: 83485dd5-f727-4c0f-a17c-e9f399d41c77
```
{% endcode %}

<mark style="color:orange;">**如果需要指定ConfigMap的Key名，可以使用如下格式进行创建：**</mark>

{% code overflow="wrap" %}
```properties
$ kubectl create cm cm-simple-key --from-file=simple-key=conf/game.properties 
configmap/cm-simple-key created

$ kubectl get cm cm-simple-key -o yaml
apiVersion: v1
data:
  simple-key: "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"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T06:57:21Z"
  name: cm-simple-key
  namespace: default
  resourceVersion: "153465"
  uid: 5d64cab9-66cf-4a9e-b52a-b542460684a8
```
{% endcode %}

<mark style="color:orange;">**也可以使用--from-file多次传入参数以从多个数据源创建ConfigMap，此方式和基于文件夹类似，只不过可以单独设置ConfigMap的Key名：**</mark>

{% code overflow="wrap" %}
```properties
$ kubectl create cm cm-mul-key --from-file=one=conf/game.properties --from-file=two=conf/ui.properties 
configmap/cm-mul-key created

$ kubectl get cm cm-mul-key -o yaml 
apiVersion: v1
data:
  one: "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"
  two: "color.good=purple\r\ncolor.bad=yellow\r\nallow.textmode=true\r\nhow.nice.to.look=fairlyNice"
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T06:59:21Z"
  name: cm-mul-key
  namespace: default
  resourceVersion: "153721"
  uid: c4159373-79df-4f91-97b7-83dbf1547e55
```
{% endcode %}

## 基于ENV文件创建ConfigMap

<mark style="color:blue;">**假如有一个文件game.properties，里面存储的是key=value形式的数据，此类文件可以当作某个应用的环境变量配置，此时可以使用--from-env-file从ENV文件创建ConfigMap**</mark>：

```properties
$ kubectl create cm cm-env-file --from-env-file=conf/game.properties 
configmap/cm-env-file created

$ kubectl get cm cm-env-file -o yaml
apiVersion: v1
data:
  enemies: aliens
  enemies.cheat: "true"
  enemies.cheat.level: noGoodRotten
  lives: "3"
  secret.code.allowed: "true"
  secret.code.lives: "30"
  secret.code.passphrase: UUDDLRLRBABAS
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T07:01:20Z"
  name: cm-env-file
  namespace: default
  resourceVersion: "153968"
  uid: caa9cfa9-ea79-499c-9ec1-a08c07365c3f
```

## 基于字符值创建ConfigMap

有时候配置并不是很多，只有几个key=value的参数，可以直接<mark style="color:blue;">**使用kubectl create configmap与--from-literal参数来定义命令行的字符值**</mark>，比如以special.how=very和special.type=charm进行创建：

{% code overflow="wrap" %}
```properties
$ kubectl create cm cm-literal --from-literal=special.how=very --from-literal=special.type=charm
configmap/cm-literal created

$ kubectl get cm cm-literal -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2023-11-29T07:05:33Z"
  name: cm-literal
  namespace: default
  resourceVersion: "154501"
  uid: adbcdc21-28f1-4820-bdb6-82e561b02aa8
```
{% endcode %}
