OpenShift4如何将ConfigMap添加至DeploymentConfig挂载Pod指定路径
直接编辑运行中Pod报错是正常现象:OpenShift 4基于Kubernetes编排逻辑,运行态Pod属于不可变资源,且绝大多数Pod是被DeploymentConfig(DC)、Deployment这类上层控制器托管的,直接修改Pod配置要么会被API Server校验拦截,要么修改后控制器会按照原有Pod模板重建新Pod覆盖改动,不会持久生效。正确的操作是修改Pod对应控制器的Pod模板,触发自动滚动更新完成ConfigMap挂载,具体操作分两种:
前置校验
先确认已创建的ConfigMap和目标工作负载在同一项目(Namespace)下,提前记录ConfigMap名称、Pod内待挂载的目标路径。
方法1:Web控制台操作
- 进入目标项目的「工作负载」-「DeploymentConfig」页面,找到目标Pod所属的DC,进入详情页
- 点击右上角「操作」-「编辑YAML」,不要直接编辑Pod实例的YAML
- 在
spec.template.spec层级下分两处添加配置,原有配置保持不变即可:- 添加ConfigMap类型的存储卷定义:
spec: template: spec: volumes: # 其他已存在的存储卷保持不动,新增下面这段 - name: app-config-volume # 自定义卷名称,和后续挂载点对应即可 configMap: name: your-ready-configmap # 替换为你已创建的ConfigMap名称 # 仅需挂载ConfigMap中部分文件时,添加items字段指定,全量挂载可省略 # items: # - key: config.properties # ConfigMap里的键名 # path: app-config.properties # 挂载后在容器内显示的文件名
- 在目标容器的
volumeMounts字段下添加挂载规则:
containers: - name: your-app-container # 你业务容器的名称,原有配置不动 # 其他镜像、启动命令等配置保持不变 volumeMounts: # 其他已存在的挂载点保持不动,新增下面这段 - name: app-config-volume # 和上方定义的卷名完全一致 mountPath: /opt/app/config # 替换为你需要挂载到容器内的目标路径 # 若不想覆盖挂载路径下的原有文件,仅挂载单个文件时添加subPath配置 # subPath: app-config.properties
- 保存YAML后,DC会自动触发滚动更新,逐步替换旧Pod,新Pod启动后ConfigMap会自动挂载到指定路径。
方法2:oc命令行操作
如果习惯用命令行,可以直接用oc客户端执行补丁命令,不需要手动编辑全量YAML,出错概率更低:
- 登录集群后切换到目标项目:
oc project your-target-project - 执行命令给DC添加ConfigMap挂载:
oc set volume dc/your-dc-name \ --add \ --type=configmap \ --configmap-name=your-ready-configmap \ --mount-path=/opt/app/config \ --name=app-config-volume - 等待滚动更新完成后,进Pod验证挂载结果即可:
# 替换为新启动的Pod名称,查看目标路径下的文件 oc rsh new-pod-name ls /opt/app/config
注意事项
- ConfigMap更新后,默认全量挂载的文件会在1~2分钟内自动同步到Pod内;如果使用了
subPath挂载单个文件,配置更新后不会自动同步,需要手动重启Pod才能加载新配置。 - 全量挂载到某个路径时,会隐藏容器镜像中该路径下的原有文件,仅显示ConfigMap内的文件;如果需要保留路径下原有文件,请使用
subPath指定单个文件挂载,或者提前将原有配置合并到ConfigMap中。
内容的提问来源于stack exchange,提问作者Lili
相关产品推荐
相关产品推荐

