В настоящее время я пытаюсь запустить PostgreSQL 10.6.1
в док-контейнере (Base-Image mcr.microsoft.com/windows/servercore:ltsc2016
), который должен быть запущен в Windows Server 2016 Datacenter (Версия 1607, сборка 14393.2759).
Всеработает нормально, включая PostgreSQL initdb
и впоследствии запускает 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