Я успешно поместил службу Windows в контейнер docker, используя следующий файл Dockerfile. Замените MyWindowsServiceName
именем вашей собственной службы windows.
# escape=\
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-1709
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
COPY ["MyWindowsServiceName/bin/Release/", "/Service/"]
WORKDIR "C:/Service/"
RUN "C:/Service/InstallUtil.exe" /LogToConsole=true /ShowCallStack MyWindowsServiceName.exe; \
Set-Service -Name "\"MyWindowsServiceName\"" -StartupType Automatic; \
Set-ItemProperty "\"Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyWindowsServiceName\"" -Name AllowRemoteConnection -Value 1
ENTRYPOINT ["powershell"]
CMD Start-Service \""MyWindowsServiceName\""; \
Get-EventLog -LogName System -After (Get-Date).AddHours(-1) | Format-List ;\
$idx = (get-eventlog -LogName System -Newest 1).Index; \
while ($true) \
{; \
start-sleep -Seconds 1; \
$idx2 = (Get-EventLog -LogName System -newest 1).index; \
get-eventlog -logname system -newest ($idx2 - $idx) | sort index | Format-List; \
$idx = $idx2; \
}
NOTE1 : Моя служба windows регистрирует в системе событий Windows. Таким образом, этот файл содержит хороший код в конце для вывода информации EventLog на консоль в соответствии с Docker соглашением. Вам может или не может понадобиться эта часть для вашего собственного обслуживания. Если нет, используйте только первую строку минус '\'.
NOTE2 : имя службы windows может отличаться от имени ее исполняемого файла. То есть «MyWindowsServiceName.exe» может иметь имя службы «My Windows Service Name» или «Fred», вам нужно знать оба.