Udostępnij za pośrednictwem


Pakiety CodePackage inicjatora

Począwszy od wersji 7.1, usługa Service Fabric obsługuje pakiety CodePackage inicjatora dla kontenerów i aplikacji wykonywalnych gościa . Pakiety CodePackage inicjatora umożliwiają wykonywanie inicjalizacji w zakresie ServicePackage przed rozpoczęciem wykonywania innych pakietów CodePackage. Ich relacja z pakietem ServicePackage jest analogiczna do tego, czym jest SetupEntryPoint dla pakietu CodePackage.

Przed kontynuowaniem pracy z tym artykułem zalecamy zapoznanie się z modelem aplikacji usługi Service Fabric i modelem hostingu usługi Service Fabric.

Uwaga

Pakiety CodePackage inicjatora nie są obecnie obsługiwane w przypadku usług napisanych przy użyciu modelu programowania usług Reliable Services .

semantyka

Oczekuje się, że pakiet CodePackage inicjatora zakończy się pomyślnie (kod zakończenia 0). Pakiet CodePackage inicjatora zakończonego niepowodzeniem zostanie uruchomiony ponownie do momentu pomyślnego ukończenia. Wiele elementów CodePackage inicjatora jest dozwolonych i jest wykonywanych w celu pomyślnego ukończenia, sekwencyjnie, w określonej kolejności przed rozpoczęciem wykonywania innych elementów CodePackage w usłudze ServicePackage.

Określanie pakietu CodePackage inicjatora

Pakiet CodePackage można oznaczyć jako inicjator, ustawiając atrybut Initializer na wartość true w pliku ServiceManifest. Jeśli istnieje wiele elementów CodePackage inicjatora, ich kolejność wykonywania można określić za pomocą atrybutu ExecOrder . ExecOrder musi być nieujemną liczbą całkowitą i jest prawidłowy tylko w przypadku pakietu CodePackage inicjatora. Pakiety CodePackage inicjatora o niższych wartościach execOrder są wykonywane jako pierwsze. Jeśli parametr ExecOrder nie jest określony dla pakietu CodePackage inicjatora, przyjmuje się wartość domyślną 0. Względna kolejność wykonywania elementu Initializer CodePackages o tej samej wartości execOrder jest nieokreślona.

Poniższy fragment kodu ServiceManifest opisuje trzy pakiety CodePackage, z których dwa są oznaczone jako inicjatory. Po aktywowaniu tego elementu ServicePackage pakiet InitCodePackage0 jest wykonywany jako pierwszy, ponieważ ma najniższą wartość elementu ExecOrder. Po pomyślnym zakończeniu (kod zakończenia 0) elementu InitCodePackage0 jest wykonywany pakiet InitCodePackage1. Na koniec po pomyślnym zakończeniu elementu InitCodePackage1 jest wykonywany pakiet 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>

Kompletny przykład przy użyciu pakietu CodePackage inicjatora

Przyjrzyjmy się kompletnej ilustracji przy użyciu funkcji Initializer CodePackages.

Ważne

W poniższym przykładzie założono, że znajomość tworzenia aplikacji kontenera systemu Windows przy użyciu usługi Service Fabric i platformy Docker.

Ten przykład odwołuje się mcr.microsoft.com/windows/nanoserver:1809. Kontenery systemu Windows Server nie są zgodne ze wszystkimi wersjami systemu operacyjnego hosta. Aby dowiedzieć się więcej, zobacz Zgodność wersji kontenera systemu Windows.

Poniższe ServiceManifest.xml opiera się na fragmencie kodu ServiceManifest opisanym wcześniej. InitCodePackage0, InitCodePackage1 i WorkloadCodePackage to pakiety CodePackage reprezentujące kontenery. Po aktywacji pakiet InitCodePackage0 jest wykonywany jako pierwszy. Rejestruje komunikat do pliku i kończy działanie. Następnie jest wykonywany pakiet InitCodePackage1, który rejestruje również komunikat do pliku i kończy działanie. Na koniec rozpocznie się wykonywanie elementu WorkloadCodePackage . Rejestruje również komunikat do pliku, generuje zawartość pliku do stdout , a następnie wysyła polecenie ping na zawsze.

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

W poniższej ApplicationManifest.xml opisano aplikację opartą na omówionych powyżej ServiceManifest.xml. Należy pamiętać, że określa tę samą instalację woluminu dla wszystkich kontenerów, tj. C:\WorkspaceOnHost jest instalowany w folderze C:\WorkspaceOnContainer we wszystkich trzech kontenerach. Efekt netto polega na tym, że wszystkie kontenery zapisują w tym samym pliku dziennika w kolejności aktywowania.

<?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 pomyślnym aktywowaniu pakietu ServicePackage zawartość folderu C:\WorkspaceOnHost\log.txt powinna być następująca.

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

Następne kroki

Aby uzyskać powiązane informacje, zobacz następujące artykuły.