CodePackage dell'inizializzatore

A partire dalla versione 7.1, Service Fabric supporta i codepackage inizializzatori per contenitori e applicazioni eseguibili guest. Gli inizializzatori CodePackage offrono la possibilità di eseguire inizializzazioni nell'ambito servicePackage prima che altri CodePackage inizino l'esecuzione. La relazione con un ServicePackage è analoga a quella di SetupEntryPoint per un CodePackage.

Prima di procedere con questo articolo, è consigliabile acquisire familiarità con il modello di applicazione di Service Fabric e il modello di hosting di Service Fabric.

Nota

Gli inizializzatori CodePackage non sono attualmente supportati per i servizi scritti usando il modello di programmazione Reliable Services .

Semantica

È previsto che un oggetto CodePackage inizializzatore venga eseguito al completamento (codice di uscita 0). Il pacchetto CodePackage inizializzatore non riuscito viene riavviato finché non viene completato correttamente. Sono consentiti più CodePackage inizializzatori e vengono eseguiti per il completamento, in sequenza, in un ordine specificato prima dell'inizio dell'esecuzione di altri CodePackage nel ServicePackage.

Specifica dei pacchetti di codice inizializzatore

È possibile contrassegnare un CodePackage come inizializzatore impostando l'attributo Initializer su true in ServiceManifest. Quando sono presenti più CodePackage inizializzatori, è possibile specificare l'ordine di esecuzione tramite l'attributo ExecOrder . ExecOrder deve essere un numero intero non negativo ed è valido solo per Initializer CodePackages. I pacchetti CodePackage inizializzatori con valori inferiori di ExecOrder vengono eseguiti per primi. Se ExecOrder non è specificato per un oggetto Initializer CodePackage, viene utilizzato il valore predefinito 0. L'ordine di esecuzione relativo di Initializer CodePackages con lo stesso valore di ExecOrder non è specificato.

Il frammento di codice ServiceManifest seguente descrive tre CodePackage due dei quali sono contrassegnati come Inizializzatori. Quando questo ServicePackage viene attivato, InitCodePackage0 viene eseguito per primo perché ha il valore più basso di ExecOrder. Al termine (codice di uscita 0) di InitCodePackage0, viene eseguito InitCodePackage1 . Infine, al completamento corretto di InitCodePackage1, viene eseguito 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>

Esempio completo con Initializer CodePackages

Verrà ora esaminato un esempio completo usando Initializer CodePackages.

Importante

L'esempio seguente presuppone familiarità con la creazione di applicazioni contenitore Di Windows con Service Fabric e Docker.

Questo esempio fa riferimento mcr.microsoft.com/windows/nanoserver:1809. I contenitori di Windows Server non sono compatibili con tutte le versioni del sistema operativo host. Per altre informazioni, vedere Compatibilità delle versioni dei contenitori di Windows.

Il ServiceManifest.xml seguente si basa sul frammento di codice ServiceManifest descritto in precedenza. InitCodePackage0, InitCodePackage1 e WorkloadCodePackage sono CodePackage che rappresentano i contenitori. Al momento dell'attivazione, InitCodePackage0 viene eseguito per primo. Registra un messaggio in un file ed esce. Viene quindi eseguito InitCodePackage1 che registra anche un messaggio in un file ed esce. Infine, WorkloadCodePackage inizia l'esecuzione. Registra anche un messaggio in un file, restituisce il contenuto del file in stdout e quindi esegue il ping per sempre.

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

Il ApplicationManifest.xml seguente descrive un'applicazione in base alla ServiceManifest.xml descritta in precedenza. Si noti che specifica lo stesso montaggio del volume per tutti i contenitori, ad esempio C:\WorkspaceOnHost viene montato in C:\WorkspaceOnContainer in tutti e tre i contenitori. L'effetto netto è che tutti i contenitori scrivono nello stesso file di log nell'ordine in cui vengono attivati.

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

Dopo l'attivazione del ServicePackage, il contenuto di C:\WorkspaceOnHost\log.txt deve essere il seguente.

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

Passaggi successivi

Per informazioni correlate, vedere gli articoli seguenti.