Контейнер 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"