Windows C# + C++ 中的服务拒绝在 Docker 中启动

Windows service in C# + C++ is refusing to start in Docker

我在 VS 2017 中创建了一个包含 2 个主要项目(和常见项目)的解决方案。该体系结构说明了一个非常大的遗留项目,因此无法更改。 主项目是一个 .Net 可执行文件,它的主要 class 继承自 'ServiceBase' class,以便用作 Windows 服务。它定义了 WCF 端点并使用接口 'IWcfXmlServer' 来处理请求。 另一个项目是一个带有 class 的 C++ 项目,它实现了 'IWcfXmlServer' 接口并用于处理请求。

我在本地创建了一个 Windows 服务并将其指向解决方案的 .exe 文件,它工作正常。

下一步是将该应用程序放在 Docker 容器中。 我添加了 Docker 支持,其中添加了 "docker-compose" .yml 文件:

version: '3.4'

services:
  wcfservice:
    image: ${DOCKER_REGISTRY}wcfservice
    build:
      context: .\..\WcfService
      dockerfile: Dockerfile

和一个Docker文件:

FROM microsoft/dotnet-framework:4.7.1-windowsservercore-1709
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["C:\app\WcfService.exe"]

当我构建解决方案并开始调试时,我得到:

Cannot start service from the command line or a debugger. A Windows Service must first be installed (using installutil.exe) and then started with the ServerExplorer, Windows Services Administrative tool or the NET START command.

但仍然创建了容器。

我在创建的 Docker 容器中打开 PowerShell 并使用 "New-Service" 创建一个新服务并将其指向我的 .exe 文件。当我尝试 运行 Start-Service 时出现错误。

我使用Windows事件日志得到错误描述:

EntryType : Error Message : Service cannot be started. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'testole.dll' or one of its dependencies. The specified module could not be found. at WcfService.WcfXmlServerFacade..ctor() --- End of inner exception stack trace --- at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.ServiceModel.Description.ServiceDescription.CreateImplementation(Type serviceType) at System.ServiceModel.Description.ServiceDescription.SetupSingleton(ServiceDescription serviceDescription, Object implementation, Boolean isWellKnown) at System.ServiceModel.Description.ServiceDescription.GetService(Type serviceType) at System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implem... Source : WcfService1

我不知道为什么它无法 运行 C++ dll,也不知道如何获取有关错误的更多信息 (Console.Writeine() \ Debug.Writeine() ) 由于某种原因没有工作。

提前致谢。

您很可能缺少 Visual C++ Redistributable 软件包。我怀疑它没有默认安装在 windows docker 图像上。

尝试将以下行(用于下载 VC++ 2015 Update 3 x64)添加到 FROM 行下方的 Dockerfile:

ADD https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe /vc_redist.x64.exe
RUN C:\vc_redist.x64.exe /quiet /install

来源 (https://github.com/Microsoft/dotnet-framework-docker/issues/15)