我终于明白了。我将在此处发布答案,但我还将继续执行在 Windows 中开发的 Service Fabric 项目以在 Linux 上运行的所有步骤。
入口点
在 SF 项目的 ServiceManifest.xml 中,有一个 EntryPoint/ExeHost/Program 节点。在 Windows 中,这指向 msbuild 生成的 exe。在 Linux 中没有那么多。
- 如果您没有安装 npm,请安装它。
- 运行
npm i -g yo
- 运行
npm i -g generator-azuresfcsharp
- 在测试文件夹中,运行
yo azuresfcsharp
当生成器运行时,它会给你一个 SF 项目文件夹和一个 c# 项目文件夹。转到 SF 项目/服务名称文件夹/代码。在该文件夹中将有两个名为 entryPoint.sh 和 dotnet-include.sh 的文件
您需要将它们添加到您的项目中,并将它们设置为 Content and Copy Always。
最后,在 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
Linux 环境
现在您需要在某个地方在本地运行它。我用码头工人。 Here 是完整设置说明的链接,但我将在这里介绍基础知识。
首先,您需要使用以下设置更新您的 docker 守护进程配置:
{
"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 本地群集管理器,则需要右键单击系统托盘中的图标,然后单击“删除群集”。然后,当完成后,您需要退出。您必须移除集群,否则会发生奇怪的事情。
启动 docker 映像后,打开它的 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 文件执行此操作。