gpt4 book ai didi

postgresql - Docker 中的 postgres 在命名或绑定(bind)卷上的数据目录适用于 Windows Server 2019 但不适用于 Windows Server 2016

转载 作者:IT老高 更新时间:2023-10-28 21:21:18 25 4
gpt4 key购买 nike

我目前正在尝试运行 PostgreSQL 10.6.1在应在 Windows Server 2016 数据中心(版本 1607,内部版本 14393.2759)上运行的 docker 容器(基本镜像为 mcr.microsoft.com/windows/servercore:ltsc2016)中。

一切运行良好,包括 PostgreSQL 的 initdb然后运行 ​​PostgreSQL - 只要 PostgreSQL 的数据目录不是 docker 主机上的卷。

如果我尝试将 PostgreSQL 的数据目录放在 named or bind volume 上运行它, PostgreSQL 能够做到它的initdb但之后无法启动。

我怀疑该错误是由于安装的卷可见为 symlink在容器内取决于 mcr.microsoft.com/windows/servercore:ltsc2016 ,导致 PostgreSQL 失败。上 mcr.microsoft.com/windows/servercore:1809 ,这种行为改变了 - 安装的卷看起来像“正常”目录,并且 PostgreSQL 能够启动。

由于根本没有任何有用的错误消息,并且在容器外运行没有持久存储的数据库听起来是一件非常无用的事情,因此我们不胜感激。

我正在使用的 Dockerfile 如下所示:

FROM mcr.microsoft.com/windows/servercore:ltsc2016
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
ARG version=10.6-1

RUN [Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls' ; \
Invoke-WebRequest $('https://get.enterprisedb.com/postgresql/postgresql-{0}-windows-x64-binaries.zip' -f $env:version) -OutFile 'postgres.zip' -UseBasicParsing ; \
Expand-Archive postgres.zip -DestinationPath C:\ ; \
Remove-Item postgres.zip ; \
Remove-Item 'C:\pgsql\pgAdmin 4' -Recurse ; \
Remove-Item 'C:\pgsql\StackBuilder' -Recurse ; \
Remove-Item 'C:\pgsql\doc' -Recurse
RUN [Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls' ; \
Invoke-WebRequest 'http://download.microsoft.com/download/0/5/6/056DCDA9-D667-4E27-8001-8A0C6971D6B1/vcredist_x64.exe' -OutFile vcredist_x64.exe ; \
Start-Process vcredist_x64.exe -ArgumentList '/install', '/passive', '/norestart' -NoNewWindow -Wait ; \
Remove-Item vcredist_x64.exe

SHELL ["cmd", "/S", "/C"]
RUN setx /M PATH "C:\pgsql\bin;%PATH%"
RUN MD data
RUN setx /M PGDATA "C:\data"

ENV PGUSER postgres
ENV PGPASSWORD postgres

COPY docker-entrypoint.cmd /
COPY start.cmd /

EXPOSE 5432

ENTRYPOINT ["docker-entrypoint.cmd"]
CMD [ "start.cmd"]

引用 docker-entrypoint.cmd看起来像这样:
@ECHO %PGPASSWORD% > pw.txt

@ECHO OFF
IF NOT EXIST %PGDATA%/PG_VERSION (
initdb.exe --encoding=UTF8 --username=%PGUSER% --pwfile=pw.txt
@echo host all all 0.0.0.0/0 trust > %PGDATA%/pg_hba.conf
@echo host all all ::0/0 trust >> %PGDATA%/pg_hba.conf
)

%*

引用 start.cmd看起来像这样:
@echo off

pg_ctl start -o "-h * -c max_prepared_transactions=100 -c max_connections=1000"

REM logic to keep container alive
:ENDLESS
CALL :sleep 100000
goto ENDLESS
exit

REM https://superuser.com/questions/48231/how-do-i-make-a-batch-file-wait-sleep-for-some-seconds
:sleep
ping 127.0.0.1 -n %1 -w 1000 > NUL

最佳答案

[moby/moby#25908] 上已经报告了类似的问题
( https://github.com/moby/moby/issues/25908 ) 但被重定向到这里以在 https://github.com/docker/for-win/issues 上检查/打开
我在打开和关闭的问题列表中搜索了这个问题,但找不到任何。

关于postgresql - Docker 中的 postgres 在命名或绑定(bind)卷上的数据目录适用于 Windows Server 2019 但不适用于 Windows Server 2016,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com