Initialisierer-CodePackages
Ab Version 7.1 unterstützt Service Fabric Initialisierer-CodePackages für Container- und ausführbare Gastanwendungen. Initialisierer-CodePackages bieten die Möglichkeit, Initialisierungen im ServicePackage-Bereich auszuführen, bevor andere CodePackages mit der Ausführung beginnen. Ihre Beziehung zu einem ServicePackage ist analog zur Beziehung eines SetupEntryPoint zu einem CodePackage.
Bevor Sie mit diesem Artikel fortfahren, sollten Sie sich mit dem Service Fabric-Anwendungsmodell und dem Service Fabric-Hostingmodell vertraut machen.
Hinweis
Initialisierer-CodePackages Code Pakete werden derzeit nicht für Dienste unterstützt, die mit dem Reliable Services-Programmiermodell geschrieben wurden.
Semantik
Es wird erwartet, dass ein Initialisierer-CodePackage bis zum erfolgreichen Abschluss (Exitcode 0) ausgeführt wird. Ein fehlerhaftes Initialisierer-CodePackage wird neu gestartet, bis es erfolgreich abgeschlossen wurde. Mehrere Initialisierer-CodePackages sind zulässig und werden bis zum erfolgreichen Abschluss, sequenziell, in einer angegebenen Reihenfolge ausgeführt, bevor andere CodePackages im ServicePackage mit der Ausführung beginnen.
Angeben von Initialisierer-CodePackages
Sie können ein CodePackage als Initialisierer markieren, indem Sie das Initializer-Attribut im Servicemanifest auf TRUE festlegen. Wenn mehrere Initialisierer-CodePackages vorhanden sind, kann ihre Ausführungsreihenfolge über das ExecOrder-Attribut angegeben werden. ExecOrder- muss eine nicht negative ganze Zahl sein und ist nur für Initialisierer-CodePackages gültig. Initialisierer-CodePackages mit niedrigeren Werten für ExecOrder werden zuerst ausgeführt. Wenn ExecOrder für ein Initialisierer-CodePackage nicht angegeben wird, wird der Standardwert 0 angenommen. Die relative Ausführungsreihenfolge von Initialisierer-CodePackages mit einem gleichen Wert von ExecOrder ist nicht festgelegt.
Im folgenden Codeausschnitt aus einem Dienstmanifest werden drei CodePackages beschrieben, von denen zwei als Initialisierer markiert sind. Wenn dieses ServicePackage aktiviert ist, wird InitCodePackage0 zuerst ausgeführt, da es den niedrigsten Wert von ExecOrder aufweist. Nach erfolgreichem Abschluss (Exitcode 0) von InitCodePackage0 wird InitCodePackage1 ausgeführt. Schließlich wird nach erfolgreichem Abschluss von InitCodePackage1WorkloadCodePackage ausgeführt.
<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>
Vollständiges Beispiel mit Initialisierer-CodePackages
Sehen wir uns ein vollständiges Beispiel mit Initialisierer-CodePackages an.
Wichtig
Im folgenden Beispiel wird davon ausgegangen, dass Sie mit der Erstellung von Windows-Containeranwendungen mit Service Fabric und Docker vertraut sind.
In diesem Beispiel wird auf mcr.microsoft.com/windows/nanoserver:1809 verwiesen. Windows Server-Container sind nicht mit allen Versionen eines Hostbetriebssystems kompatibel. Weitere Informationen finden Sie unter Versionskompatibilität von Windows-Containern.
Die folgende Datei „ServiceManifest.xml“ basiert auf dem zuvor beschriebenen ServiceManifest-Codeausschnitt. InitCodePackage0, InitCodePackage1 und WorkloadCodePackage sind CodePackages, die Container darstellen. Nach der Aktivierung wird InitCodePackage0 zuerst ausgeführt. Es protokolliert eine Meldung in einer Datei und wird dann beendet. Als nächstes wird InitCodePackage1 ausgeführt, das auch eine Meldung in einer Datei protokolliert und dann beendet wird. Zum Schluss wird die Ausführung von WorkloadCodePackage gestartet. Es protokolliert ebenfalls eine Meldung in einer Datei, gibt den Inhalt der Datei an stdout aus und pingt dann endlos.
<?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>
In der folgenden Datei „ApplicationManifest.xml“ wird eine Anwendung auf der Grundlage der oben erläuterten Datei „ServiceManifest.xml“ beschrieben. Beachten Sie, dass sie die gleiche Volumeeinbindung für alle Container angibt, d. h. C:\WorkspaceOnHost wird in allen drei Containern unter C:\WorkspaceOnContainer eingebunden. Das Ergebnis davon ist, dass alle Container in der Reihenfolge, in der sie aktiviert werden, in dieselbe Protokolldatei schreiben.
<?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>
Nachdem das ServicePackage erfolgreich aktiviert wurde, sollte der Inhalt von C:\WorkspaceOnHost\log.txt wie folgt lauten.
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
Nächste Schritte
Weitere Informationen finden Sie in den folgenden Artikeln.