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
相关产品推荐
相关产品推荐

