Aracılığıyla paylaş


Başlatıcı Kod Paketleri

Sürüm 7.1'den başlayarak Service Fabric, kapsayıcılar ve konuk yürütülebilir uygulamalar için Initializer CodePackages'ı destekler. Initializer CodePackages, diğer CodePackage'lar yürütmeye başlamadan önce ServicePackage kapsamında başlatma gerçekleştirme fırsatı sağlar. ServicePackage ile ilişkileri, CodePackage için SetupEntryPoint'in ne olduğuyla benzerdir.

Bu makaleye devam etmeden önce Service Fabric uygulama modeli ve Service Fabric barındırma modeli hakkında bilgi edinmenizi öneririz.

Not

Initializer CodePackages şu anda Reliable Services programlama modeli kullanılarak yazılan hizmetler için desteklenmemektedir.

Semantik

Başlatıcı CodePackage'ın başarıyla tamamlanmasını (çıkış kodu 0) çalıştırması beklenir. Başarısız bir Initializer CodePackage başarıyla tamamlanana kadar yeniden başlatılır. ServicePackage'daki diğer CodePackage'lar yürütmeye başlamadan önce birden çok Başlatıcı CodePackage'a izin verilir ve başarıyla tamamlanabilmesi için sırayla yürütülür.

Başlatıcı CodePackage'ları Belirtme

ServiceManifest'te Initializer özniteliğini true olarak ayarlayarak CodePackage'ı Başlatıcı olarak işaretleyebilirsiniz. Birden çok Initializer CodePackage olduğunda, yürütme sırası ExecOrder özniteliği aracılığıyla belirtilebilir. ExecOrder negatif olmayan bir tamsayı olmalıdır ve yalnızca Initializer CodePackages için geçerlidir. İlk olarak ExecOrder değerleri daha düşük olan Başlatıcı CodePackage'lar yürütülür. Başlatıcı CodePackage için ExecOrder belirtilmezse varsayılan 0 değeri varsayılır. Aynı ExecOrder değerine sahip Initializer CodePackages göreli yürütme sırası belirtilmemiştir.

Aşağıdaki ServiceManifest kod parçacığında ikisi Başlatıcı olarak işaretlenmiş üç CodePackage açıklanmaktadır. Bu ServicePackage etkinleştirildiğinde, en düşük ExecOrder değerine sahip olduğundan ilk olarak InitCodePackage0 yürütülür. InitCodePackage0 başarıyla tamamlandığında (çıkış kodu 0), InitCodePackage1 yürütülür. Son olarak, InitCodePackage1 başarıyla tamamlandığında WorkloadCodePackage yürütülür.

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

Initializer CodePackages kullanarak tam örnek

Initializer CodePackages kullanarak tam bir örneğe bakalım.

Önemli

Aşağıdaki örnekte, Service Fabric ve Docker kullanarak Windows kapsayıcı uygulamaları oluşturma konusunda bilgi sahibi olduğunuz varsayılır.

Bu örnek mcr.microsoft.com/windows/nanoserver:1809 başvurur. Windows Server kapsayıcıları, konak işletim sisteminin tüm sürümlerinde uyumlu değildir. Daha fazla bilgi edinmek için bkz . Windows Kapsayıcı Sürümü Uyumluluğu.

Aşağıdaki ServiceManifest.xml, daha önce açıklanan ServiceManifest kod parçacığını temel alır. InitCodePackage0, InitCodePackage1 ve WorkloadCodePackage kapsayıcıları temsil eden CodePackage'lardır. Etkinleştirmeden sonra ilk olarak InitCodePackage0 yürütülür. Bir dosyaya ileti kaydeder ve çıkar. Ardından InitCodePackage1 yürütülür ve bu da bir dosyaya ileti kaydeder ve dosyadan çıkar. Son olarak, WorkloadCodePackage yürütülmeye başlar. Ayrıca bir dosyaya bir ileti kaydeder, dosyanın içeriğini stdout'a aktarır ve ardından sonsuza kadar ping'ler.

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

Aşağıdaki ApplicationManifest.xml, yukarıda açıklanan ServiceManifest.xml temel alan bir uygulama açıklanmaktadır. Tüm kapsayıcılar için aynı Birim bağlamasını belirttiğine dikkat edin; örneğin , C:\WorkspaceOnHost üç kapsayıcıda da C:\WorkspaceOnContainer'a bağlanır. Net etki, tüm kapsayıcıların etkinleştirildikleri sırayla aynı günlük dosyasına yazmalarıdır.

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

ServicePackage başarıyla etkinleştirildikten sonra, C:\WorkspaceOnHost\log.txt içeriği aşağıdaki olmalıdır.

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

Sonraki adımlar

İlgili bilgiler için aşağıdaki makalelere bakın.