Balíčky kódu inicializátoru

Od verze 7.1 Service Fabric podporuje inicializační balíčky CodePackage prokontejnery a spustitelné aplikace hosta . Inicializační balíčky CodePackage poskytují možnost provádět inicializace v oboru ServicePackage před zahájením provádění jiných balíčků CodePackage. Jejich vztah k ServicePackage je obdobou toho, co je SetupEntryPoint pro CodePackage.

Než budete pokračovat v tomto článku, doporučujeme seznámit se s aplikačním modelem Service Fabric a modelem hostování Service Fabric.

Poznámka

Balíčky CodePackage inicializátoru se v současné době nepodporují pro služby napsané pomocí programovacího modelu Reliable Services .

Sémantika

K úspěšnému dokončení se očekává spuštění balíčku CodePackage inicializátoru (ukončovací kód 0). Selhání inicializačního balíčku CodePackage se restartuje, dokud se úspěšně nedokončuje. Je povoleno více balíčků CodePackage inicializátoru a jsou spouštěny k úspěšnému dokončenípostupněv zadaném pořadí před zahájením provádění jiných CodePackage v ServicePackage.

Určení balíčků CodePackage inicializátoru

CodePackage můžete označit jako inicializátor nastavením atributu Initializer na true v ServiceManifest. Pokud existuje více inicializačních balíčků CodePackage, jejich pořadí provádění lze určit prostřednictvím atributu ExecOrder . ExecOrder musí být nezáporné celé číslo a je platné pouze pro inicializační balíčky CodePackages. Inicializační balíčky CodePackage s nižšími hodnotami ExecOrder jsou provedeny jako první. Pokud není zadán ExecOrder pro inicializační CodePackage, předpokládá se výchozí hodnota 0. Relativní pořadí provádění inicializačních balíčků CodePackages se stejnou hodnotou ExecOrder není určeno.

Následující fragment kódu ServiceManifest popisuje tři balíčky CodePackage, z nichž dva jsou označené jako inicializátory. Když je tento balíček ServicePackage aktivován, InitCodePackage0 je spuštěn jako první, protože má nejnižší hodnotu ExecOrder. Po úspěšném dokončení (ukončovací kód 0) initCodePackage0 se spustí InitCodePackage1 . Nakonec se po úspěšném dokončení InitCodePackage1 spustí 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>

Kompletní příklad s využitím balíčků CodePackages inicializátoru

Podívejme se na úplný příklad s využitím inicializačních balíčků CodePackages.

Důležité

Následující příklad předpokládá znalost vytváření kontejnerových aplikací pro Windows pomocí Service Fabric a Dockeru.

Tento příklad odkazuje na mcr.microsoft.com/windows/nanoserver:1809. Kontejnery Windows Serveru nejsou kompatibilní ve všech verzích hostitelského operačního systému. Další informace najdete v tématu Kompatibilita verzí kontejnerů Windows.

Následující ServiceManifest.xml vychází z výše popsaného fragmentu kódu ServiceManifest. InitCodePackage0, InitCodePackage1 a WorkloadCodePackage jsou Balíčky CodePackage, které představují kontejnery. Po aktivaci se nejprve spustí InitCodePackage0 . Protokoluje zprávu do souboru a ukončí se. Dále se spustí InitCodePackage1 , který také protokoluje zprávu do souboru a ukončí se. Nakonec se spustí balíček WorkloadCodePackage . Také protokoluje zprávu do souboru, vypíše obsah souboru do příkazu stdout a pak napořád odešle příkaz 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>

Následující ApplicationManifest.xml popisuje aplikaci na základě výše uvedených ServiceManifest.xml. Všimněte si, že určuje stejné připojení svazku pro všechny kontejnery, tj. C:\WorkspaceOnHost je připojen na C:\WorkspaceOnContainer ve všech třech kontejnerech. Čistý efekt spočívá v tom, že všechny kontejnery zapisují do stejného souboru protokolu v pořadí, ve kterém jsou aktivovány.

<?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>

Jakmile se balíček ServicePackage úspěšně aktivuje, obsah C:\WorkspaceOnHost\log.txt by měl být následující.

C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.

Další kroky

Související informace najdete v následujících článcích.