Docker中具有命名或绑定卷上的数据目录的postgres在Windows Server 2019上有效,但在Windows Server 2016上不可用

时间:2019-02-14 16:11:51

标签: postgresql docker windows-server-2016 windows-container

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

只要PostgreSQL的数据目录不是Docker主机上的卷,一切都可以正常运行,包括PostgreSQL的initdb以及随后运行的PostgreSQL。

如果我尝试将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

1 个答案:

答案 0 :(得分:0)

[moby / moby#25908]上已经报道过类似的问题 (https://github.com/moby/moby/issues/25908),但已重定向到此处以在https://github.com/docker/for-win/issues上进行检查/打开 我已经在“未解决的问题”和“已解决的问题”列表中搜索了此问题,但找不到任何问题。