Dela via


Initierare för CodePackages

Från och med version 7.1 stöder Service Fabric Initializer CodePackages för containrar och körbara gästprogram. Initializer CodePackages ger möjlighet att utföra initieringar i ServicePackage-omfånget innan andra CodePackages börjar köras. Deras relation till en ServicePackage motsvarar vad en SetupEntryPoint är för en CodePackage.

Innan du fortsätter med den här artikeln rekommenderar vi att du bekantar dig med Service Fabric-programmodellen och Service Fabric-värdmodellen.

Kommentar

Initializer CodePackages stöds för närvarande inte för tjänster som skrivits med hjälp av programmeringsmodellen Reliable Services .

Semantik

En Initializer CodePackage förväntas köras till slutförd (slutkod 0). En misslyckad Initializer CodePackage startas om tills den har slutförts. Flera Initializer CodePackages tillåts och körs till slutfört, sekventiellt, i en angiven ordning innan andra CodePackages i ServicePackage börjar köras.

Ange Initializer CodePackages

Du kan markera en CodePackage som initialiserare genom att ange attributet Initializer till true i ServiceManifest. När det finns flera Initializer CodePackages kan deras körningsordning anges via attributet ExecOrder . ExecOrder måste vara ett icke-negativt heltal och är endast giltigt för Initializer CodePackages. Initializer CodePackages med lägre värden för ExecOrder körs först. Om ExecOrder inte har angetts för en Initializer CodePackage antas standardvärdet 0. Den relativa körningsordningen för Initializer CodePackages med samma värde execOrder är ospecificerad.

Följande ServiceManifest-kodfragment beskriver tre CodePackages varav två är markerade som initialiserare. När denna ServicePackage aktiveras körs InitCodePackage0 först eftersom det har det lägsta värdet execOrder. När initCodePackage0 har slutförts (slutkod 0) körs InitCodePackage1. Slutligen körs WorkloadCodePackage när InitCodePackage1 har slutförts.

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

Fullständigt exempel med CodePackages för initialiserare

Nu ska vi titta på ett fullständigt exempel med Hjälp av Initializer CodePackages.

Viktigt!

I följande exempel förutsätter vi att du är bekant med att skapa Windows-containerprogram med Hjälp av Service Fabric och Docker.

Det här exemplet refererar till mcr.microsoft.com/windows/nanoserver:1809. Windows Server-containrar är inte kompatibla i alla versioner av ett värdoperativsystem. Mer information finns i Windows Container Version Compatibility (Windows Container Version Compatibility).

Följande ServiceManifest.xml bygger på ServiceManifest-kodfragmentet som beskrevs tidigare. InitCodePackage0, InitCodePackage1 och WorkloadCodePackage är CodePackages som representerar containrar. Vid aktivering körs InitCodePackage0 först. Det loggar ett meddelande till en fil och avslutas. Därefter körs InitCodePackage1 som även loggar ett meddelande till en fil och avslutas. Slutligen börjar WorkloadCodePackage-körningen. Det loggar också ett meddelande till en fil, matar ut innehållet i filen till stdout och pingar sedan för alltid.

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

Följande ApplicationManifest.xml beskriver ett program baserat på de ServiceManifest.xml som beskrivs ovan. Observera att den anger samma volymmontering för alla containrar, d.v.s. C:\WorkspaceOnHost monteras på C:\WorkspaceOnContainer på alla tre containrarna. Nettoeffekten är att alla containrar skriver till samma loggfil i den ordning de aktiveras.

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

När ServicePackage har aktiverats bör innehållet i C:\WorkspaceOnHost\log.txt vara följande.

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

Nästa steg

Se följande artiklar för relaterad information.