首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以将Service应用程序从Windows Docker容器中部署到集群中吗?

可以将Service应用程序从Windows Docker容器中部署到集群中吗?
EN

Stack Overflow用户
提问于 2018-10-04 00:59:51
回答 2查看 1K关注 0票数 3

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-04 00:59:51

更新:

作为Service 6.4的一部分发布的Service 3.3.617现在可以安装在容器中,用于构建和部署Service项目。这可以在Dockerfile中使用以下方法完成:

代码语言:javascript
运行
复制
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 

下面是一个Dockerfile示例

原始答案:

事实证明,这可不是什么小壮举。此脚本要求安装Windows Service Fabric SDK。安装Service的推荐(也是仅受支持的)方法是通过WebPI,即在这里有售。对WebPI进行文档化是可能的,但是存在一个问题。WebPI安装程序由三个组件组成: Service、和。WebPI安装程序将全部安装它们。不幸的是,(撰写本文时)无法在Docker容器下运行,因为它希望安装内核级驱动程序。这个bug是在这里被追踪,但是已经开放了将近一年,没有真正的进展。这意味着不能在Docker容器中运行Service集群,但是SDK和工具肯定仍然能够运行,对吗?不幸的是,没有办法告诉安装程序只安装SDK和工具,而不是运行时。

因此,也许有一种不受支持的方法来安装SDK和工具。结果表明,发布说明对各个组件的各种MSI都有引用。

可以在这里获得SDK

这里提供用于Visual的工具

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

MSI (78:34) 19:07:56:049:产品: Microsoft Azure Service Fabric SDK --此产品需要安装Service Fabric Runtime。 此产品需要安装Service运行时。行动结束19:07:56: LaunchConditions。返回值3。

我们又一次被击落了。我没有发现Service的其他打包版本(巧克力有一个,但它只是启动了WebPI安装程序),这留下了一个最后的解决方案;我们手动安装SDK,而不需要安装程序的帮助。这需要反向工程安装程序所做的工作,并将其集成到我们的Dockerfile中。

SDK安装程序做了一些事情。它将一堆文件复制到c:\program files\microsoft sdks\service fabric\中,并将一堆文件复制到c:\program files\microsoft service fabric\中。它也是GAC的一堆东西(如System.Fabric.dll),向注册表中添加了一些内容,并且还安装了一个Powershell模块。为了让脚本运行,我们需要做所有这些事情。

我最后所做的是将关键文件夹挂载为Docker卷,以便在容器中使用它们:

代码语言:javascript
运行
复制
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脚本加载的Powershell模块:

代码语言:javascript
运行
复制
Import-Module "$ModuleFolderPath\ServiceFabricSDK.psm1"

接下来,我们需要共享c:\program files\microsoft service fabric\bin\fabric\fabric.code,因为它有许多安装程序GACs的DLL。

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

当容器启动时,我们需要执行以下操作:

首先,使用PowerShell注册该模块:

代码语言:javascript
运行
复制
Copy-Item C:\ServiceFabricBin C:\windows\system32\WindowsPowerShell\v1.0\modules\ServiceFabric -Recurse

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

代码语言:javascript
运行
复制
Copy-Item C:\ServiceFabricCode\System.Fabric*.dll C:\windows\system32\WindowsPowerShell\v1.0\modules\ServiceFabric -Recurse

在此之后,您应该能够运行Get-Module -ListAvailable并看到ServiceFabric模块完全加载。

还有最后一件事要做。Deploy-FabricApplication.ps1脚本导入ServiceFabricSDK.psm1模块(参见上文)。但是$ModuleFolderPath是什么呢?在默认情况下,脚本会在注册表中查找这个值,当然安装程序会为您设置这个值。我们不想使用Docker映像的注册表,所以我们只需要更改脚本来查看环境变量:

代码语言:javascript
运行
复制
$ModuleFolderPath = $ENV:ModuleFolderPath
Import-Module "$ModuleFolderPath\ServiceFabricSDK.psm1"

现在,我们可以在运行Docker容器(或者从Dockerfile)时设置这个环境变量。显然,如果您不想修改Deploy-FabricApplication.ps1文件,您也可以在HKLM:\SOFTWARE\Microsoft\Service Fabric SDK\FabricSDKPSModulePath上设置它。我非常反对注册表,所以环境变量(或者只是硬代码,如果您真的不在乎)对我来说更有意义。

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

代码语言:javascript
运行
复制
Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\My\ -FilePath C:\Certs\MyCert.pfx

我相信生产质量更高的版本是将所需的文件复制到您的Dockerfile中的映像中,而不是将它们作为卷挂载,这样映像就会更独立,但这应该是相当直接的。此外,我相信GAC‘’ed的DLL也可以在NuGet上使用,所以在Docker过程中可以通过NuGet下载所有这些文件。

此外,下面是我的完整Dockerfile,我已经成功地使用以下方法部署了一个应用程序到Service中:

代码语言:javascript
运行
复制
# 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')

我希望这对某些人有所帮助,但更多的是希望微软修复他们的安装程序来删除运行时的需求。

票数 5
EN

Stack Overflow用户

发布于 2018-10-04 08:51:32

安装Azure服务织物的最佳方法是创建一个电源文件,并从dockerfile调用它。

PowershellFile

代码语言:javascript
运行
复制
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

文档

代码语言:javascript
运行
复制
RUN powershell -noexit "& ""./InstallServiceFabric.ps1"""
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52637549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档