首页/云/Docker 容器速查/compose secrets 注入敏感文件
Compose 编排55 条

compose secrets 注入敏感文件

把敏感内容以文件形式注入容器:适用本地 compose 的文件型 secret 挂载在 /run/secrets 下,避免把口令写进环境变量与镜像。

Docker 容器速查云更新于 2026-10-13

凭据用文件注入

compose 的 secrets 把敏感内容以文件形式注入容器,默认落在 /run/secrets/ 目录下,应用按路径读取。相比把口令写进环境变量,这种方式不会被 inspect 输出带出、也不会出现在子进程的环境里,改动与轮换只涉及一个文件。单机 compose 场景下它以文件挂载形式生效,集群环境的密钥管理另有机制,语义不完全相同。

基本信息

顶层声明secrets: 名称: {file: 相对路径}
服务引用services.<服务>.secrets: [名称]
容器内位置/run/secrets/<名称>(Linux 容器)
适用范围单机与本地开发的凭据注入

典型使用场景

  • 数据库口令:不写进 compose 环境变量,改从文件读取
  • 证书与私钥:以文件形式挂入,避免打进镜像
  • 第三方接口密钥:轮换时只改一个文件并重启对应服务
  • 本地与测试隔离:真实凭据不入库,仓库里只放占位说明
  • 审计可查:注入路径统一,检查容器里是否存在明文散落

声明与读取

声明与读取
services:
  api:
    image: app/api:1.4.2
    secrets:
      - db_password        # 引用下面的声明
    environment:
      - DB_PASSWORD_FILE=/run/secrets/db_password   # 只传路径,不传值

secrets:
  db_password:
    file: ./secrets/db_password.txt   # 路径相对 compose 文件所在目录

注入方式对照

方式可见性主要风险
环境变量inspect 与子进程环境可见进程列表、日志与错误上报容易带出
文件型 secret以文件挂载,按需读取应用要改成读文件路径
写进镜像随镜像分发给所有拉取者相当于公开凭据
宿主配置文件挂载由宿主文件权限决定属主与权限需单独管理
声明里的 file 路径相对 compose 文件所在目录解析,在不同目录执行命令时结果一致,这点比手写挂载路径更稳。
仓库里只提交占位文件与说明,真实内容由部署环节注入;把真实凭据提交进版本库等于永久泄露。
检查是否真的用上了 secret:容器里 cat /run/secrets/名称 能读到内容、而 docker inspect 的环境变量里看不到明文,才算改造到位。

易错点

  • 口令仍写在环境变量里:inspect 与子进程环境都会带出,改造要连应用读取方式一起改
  • 把真实凭据提交进仓库:历史记录无法回滚,只能作废并轮换
  • 以为文件挂载自带加密:它只解决分发方式,宿主与容器内的权限控制仍要单独做
  • 轮换后不重启服务:应用启动时读取一次就缓存,改文件不重启不生效

数据来源与参考

  • Docker 官方文档:Compose secrets(docs.docker.com/reference/compose-file/secrets)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌