Как перезапустить контейнер Windows - PullRequest
5 голосов
/ 01 апреля 2019

Я пытаюсь запустить устаревшее приложение ASP.Net (.Net 4.7.1) из контейнера Windows. Одним из требований является установка системного языка, локали и местоположения на en-GB. Мне не разрешается трогать код, только web.config, если это абсолютно необходимо.

Рассматривается следующий подход:

  1. создание базового образа, содержащего все сертификаты, и примененный параметр культуры (требуется перезапуск)
  2. перезапустите базовый образ (с помощью перезапуска Windows или перезапуска контейнера, все, что работает)
  3. запустите базовый образ, чтобы убедиться, что настройки культуры применены правильно
  4. сохранить базовое изображение
  5. создать новое изображение, содержащее мое приложение, используя ранее сгенерированное базовое изображение

Dockerfile моего базового образа:

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
ARG site_root=.
WORKDIR /scripts
COPY scripts/ .

RUN powershell -f install-certificates.ps1

RUN powershell C:/Windows/System32/inetsrv/appcmd.exe set config /commit:WEBROOT /section:globalization /culture:en-GB
RUN powershell C:/Windows/System32/inetsrv/appcmd.exe set config /commit:WEBROOT /section:globalization /uiCulture:en-GB

RUN powershell Set-Culture en-GB
RUN powershell Set-WinSystemLocale en-GB
RUN powershell Set-WinHomeLocation -GeoId 242
RUN powershell Set-WinUserLanguageList en-GB -Force

Затем создайте и запустите контейнер.

docker build -t tmpaspnet .
docker run -it --name tmpcontainer --entrypoint powershell tmpaspnet
# inside the container
Restart-Computer
# container will exit, wait a few seconds
docker start tmpcontainer
docker exec tmpcontainer powershell Get-WinSystemLocale
# verify if system locale is correct set
# commit changes and save them to a new image
docker commit -m 'set system locale to en-GB' tmpcontainer myrepo/aspnet:latest

К сожалению, контейнер либо игнорирует перезапуск не полностью успешно. Когда я запускаю Get-WinSystemLocale внутри контейнера, всегда возвращается «en-US».

TL, DR: Как правильно перезапустить контейнер Windows?

Я использую следующий контейнер mcr.microsoft.com/dotnet/framework/aspnet:4.7.2

Дополнительные примечания относительно сбоев при настройке языкового пакета https://github.com/sanguedemonstro/docker-playground/blob/master/langpack-on-servercore2019.md

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Вы действительно не должны использовать Restart-Computer внутри вашего контейнера.

Если вам нужно перезапустить его, вам даже не нужно создавать оболочку внутри вашего контейнера.

Сначала вам нужно найти свой контейнерный идентификатор. Чтобы найти контейнер, вы можете использовать команду docker ps с хост-терминала.

Если у вас есть идентификатор контейнера, просто введите команду docker restart {containerId} .


Чтобы изменить культуру, вы можете использовать тег глобализации в своей сети, сконфигурировав его так.

<system.web>
    <globalization culture="en-GB" uiCulture="en-GB" />
</system.web>
1 голос
/ 01 апреля 2019

Если вы используете powershell, вы можете попробовать это решение , которое должно безопасно перезапустить контейнер Windows.

...