CodePackage dell'inizializzatore
A partire dalla versione 7.1, Service Fabric supporta i codepackage di inizializzatore per contenitori e applicazioni eseguibili guest. Gli inizializzatori CodePackage offrono la possibilità di eseguire inizializzazioni nell'ambito di 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 Initializer CodePackage venga eseguito al completamento (codice di uscita 0). Un oggetto Initializer CodePackage non riuscito viene riavviato fino a quando non viene completato correttamente. Sono consentiti più pacchetti CodePackage inizializzatori e vengono eseguiti per il completamento, in sequenza, in un ordine specificato prima che altri CodePackage inizino l'esecuzione del ServicePackage.
Specifica dei codepackage di inizializzatore
È possibile contrassegnare un Oggetto CodePackage come inizializzatore impostando l'attributo Initializer su true in ServiceManifest. Quando sono presenti più pacchetti CodePackage di inizializzazione, l'ordine di esecuzione può essere specificato tramite l'attributo ExecOrder . ExecOrder deve essere un numero intero non negativo ed è valido solo per Initializer CodePackages. Gli inizializzatori CodePackage con valori inferiori di ExecOrder vengono eseguiti per primi. Se ExecOrder non viene specificato per un oggetto Initializer CodePackage, si presuppone un valore predefinito pari a 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 completamento (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
Di seguito è riportato un esempio completo usando Initializer CodePackages.
Importante
L'esempio seguente presuppone familiarità con la creazione di applicazioni contenitore Windows con Service Fabric e Docker.
Questo esempio fa riferimento a 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 seguente ServiceManifest.xml 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. > 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. >> 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. >> C:\WorkspaceOnContainer\log.txt && type C:\WorkspaceOnContainer\log.txt && ping -t 127.0.0.1 > nul</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
</ServiceManifest>
L'ApplicationManifest.xml seguente descrive un'applicazione basata sul ServiceManifest.xml descritto 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.