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

Docker Postgres:如何从secrets.yml文件中读取密码

统一管理Secrets并适配Postgres的优雅方案

方案1:利用启动命令提取密码到环境变量

Postgres镜像支持通过POSTGRES_PASSWORD环境变量直接设置密码,我们可以在启动容器时从统一的secrets.yml中提取密码,无需单独的密码文件。

需要注意:官方Postgres镜像默认没有yq(YAML解析工具),你需要自定义镜像添加该工具(不推荐临时安装,会重复消耗资源)。

自定义Dockerfile(添加yq)

FROM postgres:latest
RUN apt-get update && apt-get install -y yq && rm -rf /var/lib/apt/lists/*

docker-compose.yaml配置

services:
  postgres:
    build: .
    volumes:
      - ./secrets.yml:/run/secrets/secrets.yml:ro  # 只读挂载统一秘钥文件
    command: >
      sh -c '
        # 从secrets.yml提取postgres密码并设置为环境变量
        export POSTGRES_PASSWORD=$(yq e ".postgres.password" /run/secrets/secrets.yml)
        # 执行Postgres官方入口脚本启动服务
        exec docker-entrypoint.sh postgres
      '
    # 补充端口、数据卷等必要配置

方案2:用Docker Compose钩子生成临时密码文件

如果不想修改镜像,可以利用Docker Compose的before_start钩子,在主机上提前从secrets.yml提取密码到临时文件,再挂载到容器中供Postgres读取。

前提

主机上已安装yq工具(可通过包管理器安装,比如apt install yq或brew install yq)。

docker-compose.yaml配置

services:
  postgres:
    image: postgres:latest
    volumes:
      - ./tmp/postgres_password:/run/secrets/postgres_password:ro
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
    hooks:
      before_start:
        host:
          # 在主机上创建临时目录并提取密码到文件
          command: sh -c 'mkdir -p ./tmp && yq e ".postgres.password" ./secrets.yml > ./tmp/postgres_password'
    # 补充端口、数据卷等必要配置

方案3:使用Docker Swarm Secrets(适合集群环境)

如果你的环境是Docker Swarm,可以直接将secrets.yml中的postgres密码导入Swarm Secrets,然后让Postgres服务读取该秘钥:

  1. 从secrets.yml提取密码并创建Swarm秘钥:
yq e ".postgres.password" ./secrets.yml | docker secret create postgres_password -
  1. docker-compose.yaml配置(需启用Swarm模式):
services:
  postgres:
    image: postgres:latest
    secrets:
      - postgres_password
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
    # 补充端口、数据卷等必要配置
secrets:
  postgres_password:
    external: true

方案对比

  • 方案1:无需主机依赖,但需要自定义镜像,环境变量方式的安全性略低于文件方式(容器内ps命令可能看到环境变量)。
  • 方案2:无需修改镜像,利用钩子自动化生成临时文件,安全性更高,但依赖主机上的yq。
  • 方案3:适合Swarm集群,秘钥管理更安全,但需要Swarm环境支持。

内容的提问来源于stack exchange,提问作者CoffeeBasedLifeform

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:48:20