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

如何使用Pulumi与Docker部署Postgres数据库且不暴露密码?

使用Pulumi+Docker部署Postgres并避免密码暴露

你的核心问题是密码通过环境变量暴露——当前代码里的POSTGRES_PASSWORD会明文出现在容器环境变量列表中,任何人通过docker inspect或容器内env命令都能看到。解决这个问题的最佳方式是利用Postgres的POSTGRES_PASSWORD_FILE特性,结合Docker Secret安全传递密码,避免敏感信息暴露。

解决方案步骤

  1. 用Docker Secret存储密码:Docker Secret会加密存储敏感数据,容器只能以只读文件的方式访问,不会泄露密码明文。
  2. 配置Postgres从文件读取密码:通过POSTGRES_PASSWORD_FILE环境变量指定密码文件路径,替代原有的POSTGRES_PASSWORD。
  3. 调整容器挂载与环境变量:在容器中挂载Docker Secret,并更新环境变量配置。

修改后的完整代码

import * as docker from '@pulumi/docker'
import * as pulumi from '@pulumi/pulumi'
import network from '../network'
import { Volume } from '../volumes'

const container_name = `${pulumi.getProject()}-postgres`
const postgresConfig = new pulumi.Config('postgres')

// 创建Docker Secret存储Postgres密码
const postgresPasswordSecret = new docker.Secret("postgres-password", {
    data: postgresConfig.requireSecret("password"),
})

const postgres = new docker.Container(container_name, {
    name: container_name,
    image: 'postgres:latest',
    restart: 'always',
    ports: [
        {
            internal: 5432,
            external: 5432,
        },
    ],
    networksAdvanced: [
        {
            name: network.name,
        },
    ],
    volumes: [
        {
            volumeName: Volume.postgres,
            containerPath: '/var/lib/postgresql/data', // 修正Postgres默认数据路径(原代码路径有误)
        },
        // 挂载Docker Secret到容器内
        {
            type: "secret",
            source: postgresPasswordSecret.name,
            target: "/run/secrets/postgres_password",
            readOnly: true,
        },
    ],
    healthcheck: {
        interval: '10s',
        retries: 10,
        tests: ['pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB'],
        timeout: '2s',
    },
    envs: [
        `POSTGRES_DB=${postgresConfig.require('db')}`,
        `POSTGRES_USER=${postgresConfig.require('user')}`,
        // 告诉Postgres从指定文件读取密码
        `POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password`,
    ],
})

export default postgres

关键说明

  • Docker Secret安全性:密码会被Docker加密存储,docker inspect查看容器时不会显示密码内容,容器内只能通过读取指定文件获取密码。
  • Pulumi Secret处理:postgresConfig.requireSecret("password")确保密码在Pulumi状态文件中加密存储,不会明文泄露。
  • 数据路径修正:原代码中/var/lib/postgres/data是错误路径,Postgres官方镜像默认数据目录为/var/lib/postgresql/data,修正后才能正确持久化数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:35:05