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

Windows Docker容器中PostgreSQL initdb因postgres.exe无输出失败

故障原因
  • 缺少VC运行时依赖:EnterpriseDB提供的PostgreSQL 13.4 Windows二进制依赖**Visual C Redistributable for Visual Studio 2015-2019 (x64)**,你使用的mcr.microsoft.com/windows:20H2-amd64基础镜像默认未预装该运行库,导致postgres.exe启动时DLL加载失败,静默退出无任何输出。
  • 无报错输出的原因:Windows控制台程序加载依赖DLL失败时,未附加调试器的场景下默认不会向标准输出/标准错误流输出错误信息,只会以非0状态码退出,因此initdb检测不到postgres.exe的版本返回内容,判定程序不存在。
验证方法

在容器内执行以下PowerShell命令确认问题:

# 执行postgres版本查询命令
& "C:\Program Files\PostgreSQL\pgsql\bin\postgres.exe" -V
# 打印上一条命令的退出码
echo $LASTEXITCODE

如果输出的退出码为-1073741515(对应错误码0xC0000135,STATUS_DLL_NOT_FOUND),即可确认是依赖DLL缺失导致的问题。

可行解决方案

在Dockerfile中添加VC++运行时的安装步骤,调整后的Dockerfile如下:

FROM mcr.microsoft.com/windows:20H2-amd64
# 提前将PostgreSQL压缩包、VC++ 2015-2019 x64运行时安装包放入构建上下文
COPY postgresql-13.4-1-windows-x64-binaries.zip /work/pgsql.zip
COPY vc_redist.x64.exe /work/vc_redist.x64.exe
RUN powershell -Command `
    # 静默安装VC++运行时
    Start-Process C:\work\vc_redist.x64.exe -ArgumentList '/install', '/quiet', '/norestart' -Wait; `
    Remove-Item C:\work\vc_redist.x64.exe -Force; `
    # 解压PostgreSQL二进制包
    Expand-Archive C:\work\pgsql.zip 'C:\Program Files\PostgreSQL' -Force; `
    Remove-Item C:\work\pgsql.zip -Force
# 将PostgreSQL bin目录添加到系统全局路径
RUN setx /M PATH "%PATH%;C:\Program Files\PostgreSQL\pgsql\bin"
额外注意事项
  • 运行initdb前需要新建普通Windows用户,PostgreSQL服务端默认禁止使用管理员账号启动,直接用ContainerAdministrator执行initdb会抛出权限错误。
  • 如果不需要图形化相关组件,也可以选择PostgreSQL的无GUI编译版本,降低依赖复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:51:02