代码之家  ›  专栏  ›  技术社区  ›  Mike Christensen

服务结构应用程序能否从Windows Docker容器中部署到集群?

  •  1
  • Mike Christensen  · 技术社区  · 7 年前

    Deploy-FabricApplication.ps1 脚本是作为模板的一部分创建的,用于将此应用程序部署到Azure(或在任何地方运行的服务结构)。我正在寻找一种方法将该机制作为Windows Docker映像的一部分进行容器化,因为我们的构建和部署过程是容器化的。有没有办法在Windows Docker容器中运行此脚本,如果有,映像需要具备哪些先决条件?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Mike Christensen    7 年前

    更新:

    ServiceFabricSDK3.3.617作为ServiceFabric6.4的一部分发布,现在可以安装在容器中以构建和部署ServiceFabric项目。这可以在Dockerfile中使用以下方法完成:

    ADD https://download.microsoft.com/download/D/D/D/DDD408E4-6802-47FB-B0A1-ECF657BEB35F/MicrosoftServiceFabric.6.4.617.9590.exe C:\TEMP\MicrosoftServiceFabricRuntime.exe
    
    ADD https://download.microsoft.com/download/D/D/D/DDD408E4-6802-47FB-B0A1-ECF657BEB35F/MicrosoftServiceFabricSDK.3.3.617.msi C:\TEMP\MicrosoftServiceFabricSDK.msi
    
    RUN C:\TEMP\MicrosoftServiceFabricRuntime.exe /accepteula /sdkcontainerclient /quiet
    
    RUN msiexec.exe /i "C:\TEMP\MicrosoftServiceFabricSDK.msi" /qn 
    

    Here is an example Dockerfile

    原始答案:

    原来,这不是一个小壮举。此脚本要求安装Windows Service Fabric SDK。安装ServiceFabricSDK的推荐(也是唯一受支持的)方法是通过WebPI is available here . 可以对WebPI进行Dockerize,但是有一个问题。WebPI安装程序由三个组件组成;用于VisualStudio的Service Fabric SDK、Service Fabric运行时和Service Fabric工具。WebPI安装程序将安装所有这些文件。不幸的是,服务结构运行时(截至本文撰写时)无法在Docker容器下运行,因为它希望安装内核级驱动程序。这个虫子是 being tracked here ,但已开放近一年,没有真正的进展。这意味着不能在Docker容器中运行Service Fabric集群,但SDK和工具肯定仍然可以运行,对吗?不幸的是,没有办法告诉安装程序只安装SDK和工具,而不安装运行时。

    因此,也许有一种不受支持的方式来安装SDK和工具。结果发现 release notes 为各个组件提供对各种MSI的引用。

    SDK Available Here

    Tools for Visual Studio Available Here

    从Dockerfile运行msiexec.exe相当简单,这意味着我们应该能够以这种方式安装SDK。不。不幸的是,msiexec将失败,出现一个通用的1603代码。如果在详细模式下运行msiexec并输出日志文件,则可以深入研究此错误并查看根本原因:

    MSI(78:34)[19:07:56:049]:产品:Microsoft Azure服务 Fabric SDK—此产品要求服务结构运行时 安装。

    结束时间:19:07:56:发射条件。返回值3。

    所以,我们又一次被击落了。我没有发现其他打包版本的servicefactsdk(Chocolatey有一个,但它只是启动WebPI安装程序),它只剩下一个最终的解决方案;我们在没有安装程序的帮助下手动安装SDK。这需要逆向工程,完全是安装程序所做的,并将其集成到我们的Dockerfile中。

    SDK安装程序做了一些事情。它把一堆文件复制到 c:\program files\microsoft sdks\service fabric\ 还有一堆文件 c:\program files\microsoft service fabric\

    我最后做的是将密钥文件夹装载为Docker卷,以便在容器中使用它们:

    docker run `
      -v 'c:\program files\microsoft sdks\service fabric\tools\psmodule\servicefabricsdk:C:\ServiceFabricModules' `
      -v 'c:\program files\microsoft service fabric\bin\fabric\fabric.code:C:\ServiceFabricCode' `
      -v 'c:\program files\microsoft service fabric\bin\servicefabric:C:\ServiceFabricBin' `
      -e ModuleFolderPath=C:\ServiceFabricModules `
      -it build-agent powershell
    

    首先,我需要分享 c:\program files\microsoft sdks\service fabric\tools\psmodule\servicefabricsdk 目录,其中包含 Deploy-FabricApplication.ps1 脚本加载:

    Import-Module "$ModuleFolderPath\ServiceFabricSDK.psm1"
    

    c:\program files\microsoft service fabric\bin\fabric\fabric.code 因为它有一堆DLL,安装程序可以使用它们。

    最后,我们分享 c:\program files\microsoft service fabric\bin\servicefabric 因为该目录包含SDK安装的PowerShell模块。

    Copy-Item C:\ServiceFabricBin C:\windows\system32\WindowsPowerShell\v1.0\modules\ServiceFabric -Recurse
    

    在你这么做之后, Get-Module -ListAvailable 将显示ServiceFabric模块。但是,不会加载导出,因为它缺少一堆DLL。安装程序将这些DLL放在GAC中,但GAC是哑的,所以让我们将这些DLL放在同一目录中,以便模块找到它们:

    Copy-Item C:\ServiceFabricCode\System.Fabric*.dll C:\windows\system32\WindowsPowerShell\v1.0\modules\ServiceFabric -Recurse
    

    在这之后,你应该可以跑了 获取模块-列表可用 并查看ServiceFabric模块已完全加载。

    还有最后一件事要做。这个 脚本导入 ServiceFabricSDK.psm1 模块(见上文)。但这是什么 $ModuleFolderPath

    $ModuleFolderPath = $ENV:ModuleFolderPath
    Import-Module "$ModuleFolderPath\ServiceFabricSDK.psm1"
    

    现在,我们可以在运行Docker容器(或从Dockerfile)时设置该环境变量。显然,如果你不想修改 文件,你可以设置为 HKLM:\SOFTWARE\Microsoft\Service Fabric SDK\FabricSDKPSModulePath

    另请注意,在脚本部署之前,您需要导入证书(可以从密钥库以PFX文件的形式下载证书):

    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\My\ -FilePath C:\Certs\MyCert.pfx
    

    我相信一个更具生产质量的版本是将所需的文件复制到Dockerfile中的映像中,而不是将它们作为卷装载,这样映像将更独立,但这应该是相当直接的。另外,我相信GAC'ed的dll也可以在NuGet上获得,因此在Docker构建过程中,可以通过NuGet下载所有这些文件。

    Dockerfile 我已经成功地将应用程序部署到服务结构,使用:

    # escape=`
    
    FROM microsoft/dotnet-framework:4.7.1
    
    SHELL ["cmd", "/S", "/C"]
    
    # Install Visual Studio Build Tools
    ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\SETUP\vs_buildtools.exe
    RUN C:\SETUP\vs_buildtools.exe --quiet --wait --norestart --nocache `
        --add Microsoft.VisualStudio.Workload.AzureBuildTools `
     || IF "%ERRORLEVEL%"=="3010" EXIT 0
    
    SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
    
    # Our Deploy Certs
    ADD ./Certs/ C:\Certs\
    
    # Update Path (I forget if this was needed for something)
    RUN SETX /M PATH $($Env:PATH + ';C:\ServiceFabricCode')
    

    我希望这有助于一些人,但更希望微软修复他们的安装程序删除运行时的要求。

        2
  •  -2
  •   Rui Jarimba    6 年前

    安装Azure服务结构的最佳方法是创建一个poweshell文件并从dockerfile调用它

    powershell文件 :

    Start-Process "msiexec" -ArgumentList '/i', 'C:/app/WebPlatformInstaller_amd64_en-US.msi', '/passive', '/quiet', '/norestart', '/qn' -NoNewWindow -Wait; 
    
    & "C:\Program Files\Microsoft\Web Platform Installer\WebPICMD.exe" /Install /Products:MicrosoftAzure-ServiceFabric-CoreSDK /AcceptEULA
    

    Dockerfile文件 :

    RUN powershell -noexit "& ""./InstallServiceFabric.ps1"""