Sdílet prostřednictvím


Balíčky kódu inicializátoru

Počínaje verzí 7.1 podporuje Service Fabric balíčky CodePackage inicializátoru pro kontejnery a spustitelné aplikace hosta. Balíčky CodePackage inicializátoru 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 ke servicepackage je analogický k tomu, 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

Očekává se, že se balíček CodePackage inicializátoru spustí k úspěšnému dokončení (ukončovací kód 0). Balíček CodePackage inicializátoru se nepovedlo restartovat, dokud se úspěšně nedokončí. Několik balíčků CodePackage inicializátoru je povoleno a provádí se na úspěšné dokončení postupně v zadaném pořadí před zahájením provádění jiných balíčků 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 balíčků CodePackage inicializátoru, jejich pořadí provádění lze zadat prostřednictvím atributu ExecOrder . ExecOrder musí být nezáporné celé číslo a je platné pouze pro balíčky CodePackage inicializátoru. Nejprve se spustí balíčky CodePackage s nižšími hodnotami ExecOrder . Pokud pro Balíček CodePackage inicializátoru není zadána ExecOrder , předpokládá se výchozí hodnota 0. Relativní pořadí provádění balíčků CodePackages inicializátoru se stejnou hodnotou ExecOrder není zadáno.

Následující fragment kódu ServiceManifest popisuje tři balíčky CodePackages, z nichž dva jsou označené jako inicializátory. Při aktivaci tohoto balíčku ServicePackage se nejprve spustí InitCodePackage0, protože má nejnižší hodnotu ExecOrder. Po úspěšném dokončení (ukončovací kód 0) initCodePackage0 se spustí InitCodePackage1. Nakonec po úspěšném dokončení InitCodePackage1 se spustí Sada 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 použití balíčků CodePackages inicializátoru

Pojďme se podívat na úplný příklad pomocí balíčků CodePackages inicializátoru.

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í kontejneru Windows.

Následující ServiceManifest.xml vychází z fragmentu kódu ServiceManifest popsaného výše. InitCodePackage0, InitCodePackage1 a WorkloadCodePackage jsou balíčky CodePackage, které představují kontejnery. Při aktivaci se nejprve spustí InitCodePackage0 . Protokoluje zprávu do souboru a ukončí se. Dále se spustí InitCodePackage1, který také zaznamená zprávu do souboru a ukončí se. Nakonec sada WorkloadCodePackage začne s prováděním. Protokoluje také zprávu do souboru, vypíše obsah souboru do stdoutu a pak příkaz ping navždy.

<?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ě ServiceManifest.xml popsané výše. Všimněte si, že určuje stejné připojení svazku pro všechny kontejnery, tj. C:\WorkspaceOnHost je připojen v C:\WorkspaceOnContainer pro všechny tři kontejnery. Čistým účinkem je, že všechny kontejnery zapisují do stejného souboru protokolu v pořadí, v jaké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>

Po úspěšné aktivaci balíčku ServicePackage by měl být obsah C:\WorkspaceOnHost\log.txt 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.