Контейнер Windows с коляской для данных

Я пытаюсь настроить контейнер nanoserver для Windows как контейнер с коляской, содержащий сертификаты, которые я использую для SSL. Поскольку SSL-сертификат требует изменений в каждой среде, мне нужно иметь возможность изменять контейнер с коляской (т.е. контейнер dev-cert, контейнер prod-cert и т. Д.) Во время запуска. Я решил проблемы с конфигурацией, но у меня возникли проблемы при использовании того же шаблона, который я использую для контейнеров Linux.

В контейнерах linux я просто копирую свои файлы в контейнер и использую шаг VOLUMES для экспорта моего тома. Затем в контейнере основного приложения я могу использовать volume_from для импорта тома из коляски.

Я пытался следовать той же схеме с nanoserver и не могу работать. Вот мой докер-файл:

# Building stage
FROM microsoft/nanoserver

RUN mkdir c:\\certs
COPY . .

VOLUME c:/certs

Контейнер строится просто отлично, но я получаю следующую ошибку при попытке запустить его. Документация Dockerfile гласит следующее:

Тома в контейнерах под управлением Windows. При использовании контейнеров под управлением Windows адрес тома внутри контейнера должен быть одним из следующих:

a non-existing or empty directory
a drive other than C:

поэтому я подумал, просто, я просто переключусь на диск D (потому что я не хочу экспортировать пустой каталог, как требует #1). Я сделал следующие изменения:

# Building stage
FROM microsoft/windowservercore as build
VOLUME ["d:"]

WORKDIR c:/certs
COPY . .

RUN copy c:\certs d:

и этот контейнер действительно начал правильно. Тем не менее, я пропустил в документах, где это говорит:

Изменение тома в Dockerfile: если какие-либо шаги сборки изменят данные в томе после того, как он был объявлен, эти изменения будут отменены.

поэтому, когда я проверил, у меня не было никаких файлов в каталоге d:\certs.

Итак, как вы можете смонтировать диск для внешнего использования в контейнере Windows, если, #1 каталог должен быть пустым, чтобы создать VOLUME на диске c в контейнере, и использовать должен использовать VOLUME для создания рекламного диска, что бессмысленно, потому что положить туда не будет в конечном контейнере?

1 ответ

Решение

К сожалению, вы не можете использовать тома контейнеров Windows таким образом. Также это ограничение является причиной того, почему использование контейнеров базы данных (таких как microsoft/mssql-server-windows-developer) является реальной болью. Вы не можете создать том в непустой папке базы данных, и в результате вы не сможете восстановить базы данных после повторного создания контейнера.

Что касается вашего варианта использования, я бы посоветовал вам использовать обратный прокси-сервер (например, Nginx). Вы создаете другой контейнер с сервером Nginx и сертификатами внутри. Затем вы позволяете ему обрабатывать все входящие HTTPS-запросы, завершать SSL/TLS и затем передавать запрос во внутренний контейнер приложения, используя простой протокол HTTP. При таком развертывании вам не нужно копировать и устанавливать сертификаты HTTPS во все контейнеры приложений. Есть только одно место, где вы храните сертификаты, и вы можете изменять сертификаты dev/test/etc, просто используя разные версии образов Nginx (или связывая папку сертификатов с помощью тома).

ОБНОВИТЬ:

Также, если вы все еще хотите использовать контейнер с коляской, вы можете попробовать один небольшой взлом. Так что в основном вы перенесете эту операцию

COPY . .

от времени сборки до времени выполнения (после запуска контейнера). Что-то вроде этого:

FROM microsoft/nanoserver

RUN mkdir c:\\certs_in
RUN mkdir c:\\certs_out

VOLUME c:/certs_out
CMD copy "C:\certs_in" *.*  "D:\certs_out"
Другие вопросы по тегам