You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

命令解释

  1. 密钥判断函数:is_secret_key用正则匹配变量名,只要包含KEY或PASSWORD(不区分大小写)就判定为密钥
  2. 服务处理逻辑:
    • 遍历每个服务,从environment中筛选出密钥变量名,赋值给服务的secrets字段
    • 删除原environment字段,新增env_file字段,文件名规则为「容器名.env」
  3. 全局Secrets生成:收集所有服务的密钥变量,生成全局的secrets配置,每个密钥对应一个以变量名命名的txt文件引用

注意事项

  • 运行命令前确保已安装JQ工具
  • 原配置中的environment字段需为对象格式(键值对),若为数组格式需先做适配
  • 生成的updated-docker-compose.yml即为最终目标配置

内容的提问来源于stack exchange,提问作者Nathanaël Blanchet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:03:18