如何用jq将Docker Compose含KEY/PASSWORD的环境变量转为Secrets
用JQ完成Docker Compose的密钥迁移与环境变量重构
需求回顾
需要对Docker Compose配置做以下改造:
- 将每个服务中名称包含
KEY或PASSWORD的环境变量转为Docker Secrets - 移除原有的
environment字段,替换为指向对应env文件的env_file字段 - 为每个服务添加对应的
secrets列表,同时生成全局的secrets配置块
实现的JQ命令
直接运行以下JQ命令即可完成所有转换(假设原配置文件为docker-compose.yml):
jq ' # 定义判断密钥变量的函数:匹配含KEY或PASSWORD的变量名(不区分大小写) def is_secret_key: test("KEY|PASSWORD"; "i"); # 遍历并处理每个服务 .services |= with_entries( .value |= ( # 提取当前服务下符合条件的密钥变量名 (.environment | keys[] | select(is_secret_key)) as $service_secrets # 为当前服务添加secrets列表 | .secrets = $service_secrets # 替换environment为env_file,文件名用容器名拼接 | del(.environment) | .env_file = "\(.container_name).env" ) ) # 生成全局的secrets配置块,每个密钥对应一个txt文件 | .secrets = ( .services[] | .secrets[] | { (.): { file: "\(.txt)" } } ) | add ' docker-compose.yml > updated-docker-compose.yml
命令解释
- 密钥判断函数:
is_secret_key用正则匹配变量名,只要包含KEY或PASSWORD(不区分大小写)就判定为密钥 - 服务处理逻辑:
- 遍历每个服务,从
environment中筛选出密钥变量名,赋值给服务的secrets字段 - 删除原
environment字段,新增env_file字段,文件名规则为「容器名.env」
- 遍历每个服务,从
- 全局Secrets生成:收集所有服务的密钥变量,生成全局的
secrets配置,每个密钥对应一个以变量名命名的txt文件引用
注意事项
- 运行命令前确保已安装JQ工具
- 原配置中的
environment字段需为对象格式(键值对),若为数组格式需先做适配 - 生成的
updated-docker-compose.yml即为最终目标配置
内容的提问来源于stack exchange,提问作者Nathanaël Blanchet
相关产品推荐
相关产品推荐

