Контейнер Docker завершает работу несмотря на наличие запущенной службы - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в Docker. Я хотел бы, чтобы мой Windwows-ServerCore контейнер выполнял задачу через регулярные промежутки времени. По этой причине я решил установить службу в своем контейнере, которая может запускать эти задачи через регулярные промежутки времени.

Это мой докер-файл -

FROM test2
SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'Continue'; $verbosePreference='Continue';"]
RUN New-LocalUser -Name "testuser" -Password (ConvertTo-SecureString -AsPlainText "CrackPassword!" -Force) -FullName "Test.User" -Description "LocalAdministrator"
RUN Add-LocalGroupMember -Group administrators -Member  testuser -Verbose
RUN "C:/Windows/Microsoft.NET/Framework64/v4.0.30319/InstallUtil.exe" /username=.\testuser /password=CrackPassword! /LogToConsole=true /ShowCallStack TestDockerService.exe
ENTRYPOINT ["powershell"] 
CMD Start-Service \""DockerService\""

Проблема заключается в том, что этот контейнер завершает работу после запуска, предположительно Powershell, поскольку команда ввода запускает службу и, завершив ее работу, завершает работу, снимая контейнер с собой.

Как я могу включить контейнер и, соответственно, чтобы мой сервис продолжал работать?

Я читал об аргументе -d с docker run, который будет detach контейнером, поэтому докер больше не будет его контролировать, но это также будет означать потерю доступа к STDIN и т. Д., Которые могут мне понадобиться , Есть ли другой способ сделать то же самое, или -d правильный подход?

Возможно, другим вариантом может быть запуск службы с batch file и выполнение бесконечного цикла после команды запуска, что позволяет контейнеру оставаться живым?

Если говорить более широко, как сохранить Docker container работающим, даже если служба не запущена, для проверки и отладки с помощью интерактивного сеанса, скажем?

1 Ответ

3 голосов
/ 20 мая 2019

Докер предназначен для работы до тех пор, пока не завершится основной процесс (с PID 1). Когда это происходит, контейнер считается остановленным. Этот основной процесс обычно не считается фоновым.

Ваш контейнер запускает команду Start-Service, он успешно регистрируется и запускает фоновую службу и выходит из . И, поскольку это ваш основной процесс, контейнер останавливается.

У вас есть разные способы сохранить контейнер живым, но все они заканчиваются тем, что основной процесс активен. Не уверен с контейнером Windows, но просто наличие цикла сна работает. Первое, что приходит мне в голову, это просто иметь команду ping 127.0.0.1 -t > NUL в конце скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...