初始設定式 Codepackage
從 7.1 版開始,Service Fabric 可針對容器和來賓可執行檔應用程式支援初始設定式 Codepackage。 初始設定式 Codepackage 讓您有機會在其他 Codepackage 開始執行之前,在 ServicePackage 範圍執行初始化。 其與 ServicePackage 的關聯性,類似於 SetupEntryPoint 對 CodePackage 的關聯性。
繼續閱讀本文之前,建議您先熟悉 Service Fabric 應用程式模型和 Service Fabric 主控模型。
注意
使用 Reliable Services 程式設計模型所撰寫的服務目前不支援初始設定式 CodePackage。
語意
初始設定式 CodePackage 應該會執行到成功完成 (結束代碼 0)。 失敗的初始設定式 CodePackage 會重新啟動,直到成功完成為止。 在 ServicePackage 中的其他 Codepackage 開始執行之前,系統會允許多個初始設定式 Codepackage,循序或依指定的順序執行至成功完成。
指定初始設定式 Codepackage
您可以在 ServiceManifest 中將 Initializer 屬性設定為 true,來將 CodePackage 標示為初始設定式。 有多個初始設定式 Codepackage 時,可以透過 ExecOrder 屬性指定其執行順序。 ExecOrder 必須為非負整數,而且只對初始設定式 CodePackage 有效。 ExecOrder 值較低的初始設定式 CodePackage 優先執行。 如果未指定初始設定式 CodePackage 的 ExecOrder,則會採取預設值 0。 ExecOrder 值相同的初始設定式 CodePackage,其相對執行順序未指定。
下列 ServiceManifest 程式碼片段描述三個 CodePackage,其中兩個標示為初始設定式。 啟動此 ServicePackage 時,首先執行 InitCodePackage0,因為其具有最低的 ExecOrder 值。 在成功完成 (結束代碼 0) InitCodePackage0 時,即會執行 InitCodePackage1。 最後,在成功完成 InitCodePackage1 時,即會執行 WorkloadCodePackage。
<CodePackage Name="InitCodePackage0" Version="1.0" Initializer="true" ExecOrder="0">
...
</CodePackage>
<CodePackage Name="InitCodePackage1" Version="1.0" Initializer="true" ExecOrder="1">
...
</CodePackage>
<CodePackage Name="WorkloadCodePackage" Version="1.0">
...
</CodePackage>
使用初始設定式 Codepackage 的完整範例
讓我們看看使用初始設定式 Codepackage 的完整範例。
重要
下列範例假設您熟悉使用 Service Fabric 和 Docker 建立 Windows 容器應用程式。
這個範例會參考 mcr.microsoft.com/windows/nanoserver:1809。 Windows Server 容器在主機 OS 的所有版本之間不相容。 若要深入了解,請參閱 Windows 容器版本相容性。
下列 ServiceManifest.xml 是根據稍早所述的 ServiceManifest 程式碼片段所建置的。 InitCodePackage0、InitCodePackage1 和 WorkloadCodePackage 是代表容器的 CodePackage。 啟用時,首先執行 InitCodePackage0。 其會將訊息記錄到檔案並結束。 接著執行 InitCodePackage1,這也會將訊息記錄到檔案並結束。 最後,開始執行 WorkloadCodePackage。 其也會將訊息記錄到檔案、將檔案的內容輸出至 stdout,然後永久 Ping。
<?xml version="1.0" encoding="UTF-8"?>
<ServiceManifest Name="WindowsInitCodePackageServicePackage" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows Init CodePackage Service</Description>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="WindowsInitCodePackageServiceType" UseImplicitHost="true"/>
</ServiceTypes>
<CodePackage Name="InitCodePackage0" Version="1.0" Initializer="true" ExecOrder="0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from InitCodePackage0. > C:\WorkspaceOnContainer\log.txt</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
<CodePackage Name="InitCodePackage1" Version="1.0" Initializer="true" ExecOrder="1">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from InitCodePackage1. >> C:\WorkspaceOnContainer\log.txt</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
<CodePackage Name="WorkloadCodePackage" Version="1.0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from WorkloadCodePackage. >> C:\WorkspaceOnContainer\log.txt && type C:\WorkspaceOnContainer\log.txt && ping -t 127.0.0.1 > nul</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
</ServiceManifest>
下列 ApplicationManifest.xml 會根據上面所述的 ServiceManifest.xml 來描述應用程式。 請注意,其會針對所有的容器指定相同的磁碟區掛接,亦即 C:\WorkspaceOnHost 會掛接在所有三個容器上的 C:\WorkspaceOnContainer。 最終效果是所有容器都會依其啟動的順序寫入至相同的記錄檔。
<?xml version="1.0" encoding="UTF-8"?>
<ApplicationManifest ApplicationTypeName="WindowsInitCodePackageApplicationType" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows Init CodePackage Application</Description>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="WindowsInitCodePackageServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ContainerHostPolicies CodePackageRef="InitCodePackage0" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="InitCodePackage1" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="WorkloadCodePackage" ContainersRetentionCount="2" RunInteractive="true">
<Volume Source="C:\WorkspaceOnHost" Destination="C:\WorkspaceOnContainer" IsReadOnly="false" />
</ContainerHostPolicies>
</Policies>
</ServiceManifestImport>
<DefaultServices>
<Service Name="WindowsInitCodePackageService" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="WindowsInitCodePackageServiceType" InstanceCount="1">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
一旦成功啟用動了 ServicePackage,C:\WorkspaceOnHost\log.txt 的內容就應該如下所示。
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
下一步
請參閱下列文章以了解相關資訊。