Как добиться постоянства с томами на контейнерах Windows? - PullRequest
0 голосов
/ 14 июня 2019

В нашей компании мы пытаемся перенести приложение в Docker с контейнерами Windows. Приложение использует базу данных PostgreSQL. Мы можем запустить приложение внутри контейнера. Однако всякий раз, когда мы останавливаем контейнер и запускаем новый с тем же изображением, все изменения, внесенные в базу данных, пропадают. Как мы можем добиться постоянства с объемами данных в контейнерах Windows?

Мы прочитали несколько статей, что сохранение может быть достигнуто с объемами данных. Мы следовали этому руководству и смогли без проблем работать с контейнерами Linux https://elanderson.net/2018/02/setup-postgresql-on-windows-with-docker/

Однако в контейнерах Windows чего-то не хватает, чтобы доставить нас туда, куда нам нужно.

Dockerfile, который мы используем для создания образа с postgres в контейнерах Windows:

-----START-----

FROM  microsoft/aspnet:4.7.2-windowsservercore-1709

EXPOSE 5432

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN [Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11, Tls' ; \
    Invoke-WebRequest -UseBasicParsing -Uri 'https://get.enterprisedb.com/postgresql/postgresql-9.6.10-2-windows-x64.exe' -OutFile 'postgresql-installer.exe' ; \
    Start-Process postgresql-installer.exe -ArgumentList '--mode unattended --superpassword password' -Wait ; \
    Remove-Item postgresql-installer.exe -Force

SHELL ["cmd", "/S", "/C"]

RUN setx /M PATH "C:\\Program Files\\PostgreSQL\\9.6\\bin;%PATH%" && \
    setx /M DATA_DIR "C:\\Program Files\\PostgreSQL\\9.6\\data" && \
    setx /M PGPASSWORD "password"

RUN powershell -Command "Do { pg_isready -q } Until ($?)" && \
    echo listen_addresses = '*' >> "%DATA_DIR%\\postgresql.conf" && \
    echo host  all  all  0.0.0.0/0  trust >> "%DATA_DIR%\\pg_hba.conf" && \
    echo host  all  all  ::0/0      trust >> "%DATA_DIR%\\pg_hba.conf" && \
    net stop postgresql-x64-9.6

----END----

Команды, которые мы используем для создания образа и запуска контейнера:

docker build -t psql1709 .

docker run -d -it -p 8701:5432 --name postgresv1 -v "posgresData:c:\Program Files\PostgreSQL\9.6\data" psql1709

1 Ответ

0 голосов
/ 14 июня 2019

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

Каждый RUN инструкция в Dockerfile выполняется в новом контейнере, и результирующие изменения шага файловой системы фиксируются в новом слое.

Однако состояние памяти не сохраняется, поэтому при запуске;

setx /M DATA_DIR "C:\\Program Files\\PostgreSQL\\9.6\\data"

Эта переменная среды известна только во время этой инструкции запуска, но не после.

Чтобы установить переменную среды, которая сохраняется как часть создаваемого образа (и будет установлена ​​для следующего RUN инструкции, а при запуске образа / контейнера), используйте ENV команду dockerfile ;

ENV DATA_DIR "C:\\Program Files\\PostgreSQL\\9.6\\data"

(я не использую Windows, поэтому дважды проверьте, цитирует ли/ escape работает как положено)

Примечание : я вижу, вы устанавливаете PGPASSWORD в переменной среды;Имейте в виду, что (при использовании ENV) переменные среды могут видеть все, у кого есть доступ к контейнеру или изображению (docker inspect покажет эту информацию).В этом случае пароль представляется паролем по умолчанию, поэтому, скорее всего, это не проблема.

...