postgres в Docker с каталогом данных на именованном или связанном томе работает в Windows Server 2019, но не в Windows Server 2016.

В настоящее время я пытаюсь запустить PostgreSQL 10.6.1 в контейнере докера (Base-Image — mcr.microsoft.com/windows/servercore:ltsc2016), который следует запускать в центре обработки данных Windows Server 2016 (версия 1607, сборка 14393.2759).

Все работает нормально, включая initdb PostgreSQL и последующий запуск PostgreSQL - до тех пор, пока каталог данных PostgreSQL не является томом на хосте докера.

Если я попытаюсь запустить его с каталогом данных PostgreSQL, размещенным на именованном или связанном томе, 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

person sven    schedule 14.02.2019    source источник
comment
Я полагаю, вы уже поняли это... если это так, нет смысла иметь СУБД внутри контейнера, если вы можете сохранять файлы данных в реальной файловой системе. Извините, я не знаю, о чем ваш вопрос...   -  person sebagomez    schedule 19.02.2019
comment
@sebagomez проблема в том, что если вы используете именованный/связанный том для сохранения данных, postgres не запускается (в то время как initdb может инициализировать каталог данных на томе).   -  person Karl Richter    schedule 21.02.2019
comment
с какой версией PowerShell вы работаете?   -  person Soleil    schedule 26.02.2019
comment
Как вы определяете свои объемы? С помощью команды docker run или через docker-compose?   -  person Manish Dash    schedule 26.02.2019


Ответы (1)


Об аналогичной проблеме уже сообщалось [moby/moby#25908] (https://github.com/moby/moby/issues/25908), но был перенаправлен сюда для проверки/открытия на https://github.com/docker/for-win/issues Я искал эту проблему в списке открытых и закрытых проблем, но ничего не нашел.

person Sobin Benny    schedule 25.02.2019