Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od wersji 7.1, usługa Service Fabric obsługuje pakiety CodePackage inicjatora dla kontenerów i aplikacji wykonywalnych gościa . Pakiety inicjalizacyjne CodePackage umożliwiają przeprowadzenie inicjalizacji w zakresie pakietu ServicePackage, zanim inne pakiety CodePackage rozpoczną wykonywanie. 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 inicjalizatora CodePackage obecnie nie są obsługiwane w przypadku usług napisanych przy użyciu modelu programowania Reliable Services.
semantyka
Oczekuje się, że pakiet CodePackage inicjatora zakończy się pomyślnie (kod zakończenia 0). Pakiet inicjujący CodePackage, który zakończył się niepowodzeniem, jest restartowany aż do jego pomyślnego zakoń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 pakietów CodePackage inicjalizatora
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 ważny tylko w przypadku pakietów 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 użycia pakietów inicjalizacyjnych CodePackages
Przyjrzyjmy się kompletnemu przykładowi użycia Initializer CodePackages.
Ważne
Przy tym przykładzie zakłada się znajomość tworzenia aplikacji kontenerów Windows z wykorzystaniem usługi Service Fabric i platformy Docker.
Ten przykład odwołuje się do 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, które reprezentują kontenery. Po aktywacji pakiet InitCodePackage0 jest wykonywany jako pierwszy. Rejestruje komunikat do pliku i kończy działanie. Następnie InitCodePackage1 jest wykonywany, który również zapisuje komunikat do pliku i kończy działanie. Na koniec rozpocznie się wykonywanie elementu WorkloadCodePackage . Rejestruje również komunikat do pliku, wypisuje zawartość pliku do stdout i następnie nieustannie wysyła żądania ping.
<?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>
W poniższej ApplicationManifest.xml opisano aplikację opartą na omówionych powyżej ServiceManifest.xml. Należy pamiętać, że określa to samo montowanie woluminu dla wszystkich kontenerów, to znaczy C:\WorkspaceOnHost jest zamontowany w 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.