共用方式為


初始設定式 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 程式碼片段所建置的。 InitCodePackage0InitCodePackage1WorkloadCodePackage 是代表容器的 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. &gt; 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. &gt;&gt; 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. &gt;&gt; C:\WorkspaceOnContainer\log.txt &amp;&amp; type C:\WorkspaceOnContainer\log.txt &amp;&amp; ping -t 127.0.0.1 &gt; 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.

下一步

請參閱下列文章以了解相關資訊。