在微服务部署中,Docker Compose 通过 env_file 或 environment 指令注入配置,但团队往往把含密钥的 .env 文件随手提交到 Git,导致云凭证外泄。SOPS(Secrets OPerationS)由 Mozilla 维护,可以对结构化文件做字段级加密,YAML 键名保持可读,值被密文替换,既方便审查又避免泄露。下面介绍从安装到集成的完整做法。

一、SOPS 核心原理与密钥后端选择
SOPS 并非简单对整个文件做对称加密,而是解析 YAML、JSON、ENV 等格式后,仅加密值部分,键名与文件结构原样保留。这种字段级加密让代码评审者能看懂配置用途,却看不到真实密码。它依赖外部密钥管理系统生成数据密钥:先用后端主密钥加密一个随机数据密钥,再用数据密钥加密文件内容,最终密文中包含加密后的数据密钥,解密时反向操作。
后端方面,个人项目可用 PGP 密钥对,执行 sops --pgp 指定指纹即可;企业环境推荐云厂商 KMS,如 AWS KMS 借助 IAM 角色自动授权,避免密钥分发。选择时应考虑团队规模与运维成本:PGP 适合单人,KMS 适合多账号协作。下面的配置示例展示 .sops.yaml 如何按规则匹配加密字段。
creation_rules:
- path_regex: .env.yaml$
encrypted_regex: "^(password|token|secret|api_key)$"
kms: "arn:aws:kms:ap-southeast-1:123456789012:key/abcd-1234"
pgp: "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2"
上述规则表示文件名匹配 .env.yaml 时,仅密码、令牌等字段被加密,其余如服务名、端口保持明文。这样在 Git 仓库中,运维人员能快速识别配置项,又不用担心核心凭证暴露。若正则写错,会导致全部或未加密,需通过 sops decrypt 测试验证。
二、加密 Compose 环境变量文件的实际操作
先创建未加密的环境文件,例如 compose.env.yaml,里面写正常键值。随后用 SOPS 加密生成密文文件,原明文可加入 .gitignore。命令 sops compose.env.yaml 会调用 .sops.yaml 规则,生成同名但内容为密文的文件,也可指定输出名。加密后文件形如 password: ENC[AES256_GCM,data:...,iv:...],直观且安全。
在 docker-compose.yml 中,通过 env_file 引用密文文件,并在启动前用 SOPS 解密到临时路径。推荐写法是在 Makefile 或脚本里先 sops --decrypt 输出到 /tmp,再让 Compose 读取。这样仓库只存密文,本地与 CI 使用相同流程。以下脚本展示自动解密启动:
#!/bin/bash # 解密环境文件到临时位置 sops --decrypt compose.env.yaml > /tmp/compose.env.yaml # 使用解密后的文件启动服务 DB_ENV_FILE=/tmp/compose.env.yaml docker compose up -d
这种方式避免了把解密逻辑写进 Compose 本身。若直接在 Compose 里写命令调用 SOPS,容器需带 SOPS 二进制且权限复杂。分离解密与编排,既清晰又易排查。注意临时文件权限应设为 600,用毕即删,防止磁盘残留。
对于多环境管理,可为 dev、prod 各建 .sops.yaml 并绑定不同 KMS key。切换时通过 SOPS_KMS_ARN 环境变量覆盖,无需改文件。下表对比两种后端在轮换密钥时的差异:
| 后端类型 | 密钥轮换方式 | 协作成本 |
|---|---|---|
| PGP | 重新加密并分发新公钥 | 高,需人工同步 |
| KMS | 后台改别名指向新 key | 低,IAM 控制 |
三、CI 集成与常见故障排查
在 GitHub Actions 中,Runner 需获得 KMS 解密权限。通常借助 OIDC 获取临时凭证,避免长期密钥。步骤为:配置 AWS 角色信任仓库,Action 里用 aws-actions/configure-aws-credentials 登录,再执行 sops decrypt。明文不出 Runner 磁盘,任务结束自动清理。以下片段展示关键动作:
jobs:
deploy:
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/gha-sops
aws-region: ap-southeast-1
- run: sops --decrypt compose.env.yaml > /tmp/compose.env.yaml
- run: docker compose up -d
常见报错包括 error decrypting tree,多因本地无对应 PGP 私钥或 KMS 权限不足。用 sops -d --verbose 看具体后端错误。另一个坑是文件换行符:Windows 编辑的 env 文件带 CRLF,SOPS 加密后 Compose 读取可能失败,建议在仓库统一 LF。还有人把解密后文件提交,反而泄密,应严格加忽略规则。
当团队新增成员,PGP 方案要把其公钥加进 .sops.yaml 并 sops updatekeys 重新加密;KMS 则只需为其 IAM 用户加 decrypt 权限。无论哪种,都要审计谁拥有解密权。SOPS 虽不解决运行时内存泄露,但大幅降低静态存储与传输风险,是 Compose 密钥管理的实用方案。
SOPS Docker_Compose 环境变量加密修改时间:2026-08-16 21:20:15