CodePackages do Inicializador
A partir da versão 7.1, o Service Fabric suporta o Initializer CodePackages para contentores e aplicações executáveis convidadas . O Initializer CodePackages oferece a oportunidade de realizar inicializações no âmbito ServicePackage antes de outros CodePackages iniciarem a execução. A sua relação com um ServicePackage é análoga ao que é um SetupEntryPoint para um CodePackage.
Antes de prosseguir com este artigo, recomendamos que se familiarize com o modelo de aplicação do Service Fabric e o modelo de alojamento do Service Fabric.
Nota
Atualmente, as CodePackages de Inicializador não são suportadas para serviços escritos com o modelo de programação Reliable Services .
Semântica
Espera-se que um CodePackage de Inicializador seja executado para concluir com êxito (código de saída 0). Um CodePackage de Inicializador com falha é reiniciado até ser concluído com êxito. São permitidos vários CodePackages de Inicializador e são executados para conclusão com êxito, sequencialmente, numa ordem especificada antes de outros CodePackages no ServicePackage iniciarem a execução.
Especificar CodePackages de Inicializador
Pode marcar um CodePackage como um Initializer ao definir o atributo Initializer como verdadeiro no ServiceManifest. Quando existem vários CodePackages de Inicializador, a respetiva ordem de execução pode ser especificada através do atributo ExecOrder . ExecOrder tem de ser um número inteiro não negativo e só é válido para o Initializer CodePackages. Os CodePackages de Inicializador com valores mais baixos de ExecOrder são executados primeiro. Se ExecOrder não for especificado para um CodePackage de Inicializador, é assumido um valor predefinido de 0. A ordem de execução relativa de Initializer CodePackages com o mesmo valor de ExecOrder não é especificada.
O fragmento serviceManifest seguinte descreve três CodePackages dois dos quais estão marcados como Inicializadores. Quando este ServicePackage é ativado, o InitCodePackage0 é executado primeiro, uma vez que tem o valor mais baixo de ExecOrder. Após a conclusão com êxito (código de saída 0) de InitCodePackage0, o InitCodePackage1 é executado. Por fim, após a conclusão com êxito de InitCodePackage1, WorkloadCodePackage é executado.
<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>
Exemplo completo com o Initializer CodePackages
Vejamos um exemplo completo com o Initializer CodePackages.
Importante
O exemplo seguinte pressupõe que está familiarizado com a criação de aplicações de contentor do Windows com o Service Fabric e o Docker.
Este exemplo faz referência a mcr.microsoft.com/windows/nanoserver:1809. Os contentores do Windows Server não são compatíveis em todas as versões de um SO anfitrião. Para saber mais, veja Compatibilidade com a Versão do Contentor do Windows.
O seguinte ServiceManifest.xml baseia-se no fragmento ServiceManifest descrito anteriormente. InitCodePackage0, InitCodePackage1 e WorkloadCodePackage são CodePackages que representam contentores. Após a ativação, InitCodePackage0 é executado primeiro. Regista uma mensagem num ficheiro e sai. Em seguida, o InitCodePackage1 é executado, o que também regista uma mensagem num ficheiro e sai. Por fim, o WorkloadCodePackage inicia a execução. Também regista uma mensagem num ficheiro, produz o conteúdo do ficheiro para stdout e, em seguida, pings para 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>
O ApplicationManifest.xml seguinte descreve uma aplicação com base no ServiceManifest.xml abordado acima. Tenha em atenção que especifica a mesma montagem de Volume para todos os contentores, ou seja, C:\WorkspaceOnHost está montado em C:\WorkspaceOnContainer nos três contentores. O efeito net é que todos os contentores escrevem no mesmo ficheiro de registo pela ordem em que são ativados.
<?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>
Assim que o ServicePackage tiver sido ativado com êxito, o conteúdo de C:\WorkspaceOnHost\log.txt deve ser o seguinte.
C:\Users\test>type C:\WorkspaceOnHost\log.txt
Hi from InitCodePackage0.
Hi from InitCodePackage1.
Hi from WorkloadCodePackage.
Passos seguintes
Consulte os seguintes artigos para obter informações relacionadas.