我有一个用.Net Core编写的Service Fabric应用程序。它在本地窗口SF Cluster上运行得很好。它由一个没有Web组件的单个无状态服务组成。
我现在正尝试将其部署到Linux SF群集。我能够使用service-fabric-onebox实例在Docker中运行SF。
我使用了azuresfcsharp yeomen模板获得的entryPoint.sh文件,并更改了ServiceManifest.xml文件中的EntryPoint Program节点。我也在使用dotnet cli和-r ubuntu.16.04-x64开关编译我的项目。
现在,当我尝试部署到我的SF Cluster时,我得到了
Error event: SourceId='System.Hosting', Property='CodePackageActivation:Code:EntryPoint'.
There was an error during CodePackage activation.The service host terminated with exit code:32512
有什么想法吗?
答案 0 :(得分:3)
我终于明白了。我将在这里发布答案,但我也将继续执行在Windows中开发的Service Fabric项目在Linux上运行的所有步骤。
在SF项目的ServiceManifest.xml中,有一个EntryPoint / ExeHost / Program节点。在Windows中,这指向msbuild生成的exe。与Linux不同。
npm i -g yo
npm i -g generator-azuresfcsharp
yo azuresfcsharp
当生成器运行时,它会给你一个SF项目文件夹和一个c#项目文件夹。转到SF项目/服务名称文件夹/代码。在该文件夹中将有两个名为entryPoint.sh和dotnet-include.sh
的文件您需要将这些内容添加到项目中,并将其设置为“内容”和“始终复制”。
最后,在ServiceManifest.xml中,将EntryPoint / ExeHost / Program节点更改为entryPoint.sh
使用Visual Studio进行编译不会起作用,因为您需要定位linux运行时。
附注 - 在编译之前,您需要了解Service Fabric包的布局方式。在Visual Studio中右键单击SF项目的最佳方法,单击包,转到资源管理器中的SF项目文件夹,转到pkg,然后查看。
在控制台窗口中,cd到包含您正在构建的服务的csproj文件的文件夹。我们假设您在解决方案根目录中名为pkg
的文件夹中构建部署包。所以跑:
dotnet publish -o ..\pkg\YourServicePkg\Code -r ubuntu.16.04-x64
注意 - pkg中的文件夹必须以Pkg结尾。
其他注意 - 在此处查看可以定位的运行时列表。我恰巧正在使用unbuntu。 Runtime Identifiers
最后,要完善部署包,您需要包文件夹根目录中的ApplicationManifest.xml文件,服务项目中的ServiceManifest.xml文件以及服务项目中的Config文件夹。可以在PackageRoot
中找到服务项目文件所以你有:
pkg
|
-> ApplicationManifest.xml
-> YourServicePkg
|
-> ServiceManifest.xml
-> Code (This is where you targeted dotnet publish)
-> Config
现在你需要在某个地方运行它。我用过docker。 Here是完整设置说明的链接,但我将在此处介绍基础知识。
首先,您需要使用以下设置更新docker deamon配置:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
然后,拉动图像。
docker pull servicefabricoss/service-fabric-onebox
您需要使用
打开端口19080和19000-p 19080:19080 -p 19000:19000
如果您一直在Windows中使用Service Fabric Local Cluster Manager,则需要右键单击系统托盘中的图标,然后单击“删除群集”。然后当完成时,你需要退出。你必须删除群集,否则会发生奇怪的事情。
启动泊坞窗图片后,打开它的bash并运行./setup.sh
,然后./run.sh
一旦SF在docker上运行,您可以转到localhost:19080,现在可以使用PowerShell进行部署。
首先,让我们测试一下我们的软件包是否有效。
Test-ServiceFabricApplicationPackage .\pkg\
如果有效,请让我们部署
Connect-ServiceFabricCluster localhost:19000
Register-ServiceFabricApplicationType -ApplicationPathInImageStore YourService
Remove-ServiceFabricApplicationPackage -ImageStoreConnectionString fabric:ImageStore -ApplicationPackagePathInImageStore YourService
New-ServiceFabricApplication -ApplicationName fabric:/YourService -ApplicationTypeVersion 1.0.0 -ApplicationTypeName YourServiceType
您的应用程序应该从Linux开始。
所以这就是我的原因,并导致退出代码:32512错误。
我正在使用github,显然,行结束样式设置为windows。因此,当我在另一台计算机上将其拉下时,行结尾从LF变为CR LF。
要解决此问题,我必须在Notepad ++中打开受影响的文件,然后单击编辑 - > EOL转换 - > Unix(LF)。
我必须在ApplicationManifest.xml,所有ServiceManifest.xml文件以及所有entryPoint.sh和dotnet-include.sh文件上执行此操作。