Поделиться через


Инициализатор CodePackages

Начиная с версии 7.1 Service Fabric поддерживает Initializer CodePackages для контейнеров и гостевых исполняемых приложений. Инициализаторы CodePackages предоставляют возможность осуществлять инициализацию в контексте ServicePackage перед запуском других CodePackages. Их отношение к ServicePackage аналогично тому, чем SetupEntryPoint является для CodePackage.

Прежде чем продолжить работу с этой статьей, мы рекомендуем ознакомиться с моделью приложения Service Fabric и моделью размещения Service Fabric.

Примечание.

Инициализатор CodePackage в настоящее время не поддерживается для служб, написанных с помощью модели программирования Reliable Services .

Семантика

Ожидается, что КодПакет инициализатора будет выполняться до успешного завершения (код выхода 0). Инициализатор CodePackage, который не удалось выполнить, будет перезапускаться до тех пор, пока он не завершится успешно. Несколько инициализаторов CodePackage разрешены и выполняются для успешного завершения, последовательно, в указанном порядке до начала выполнения других codePackage в ServicePackage.

Указание инициализатора CodePackages

Вы можете пометить CodePackage как инициализатор , задав атрибут Initializer значение true в ServiceManifest. При наличии нескольких инициализаторов CodePackage их порядок выполнения можно указать с помощью атрибута ExecOrder . ExecOrder должен быть неотрицательное целое число и является допустимым только для Initializer CodePackages. Инициализаторы CodePackages с меньшими значениями ExecOrder выполняются сначала. Если execOrder не указан для инициализатора CodePackage, предполагается значение по умолчанию 0. Относительный порядок выполнения Initializer CodePackages с тем же значением ExecOrder не определен.

В следующем фрагменте ServiceManifest описываются три CodePackage, два из которых помечены как инициализаторы. При активации этого ServicePackage, InitCodePackage0 выполняется первым, так как он имеет наименьшее значение ExecOrder. При успешном завершении (код выхода 0) InitCodePackage0 выполняется InitCodePackage1. Наконец, при успешном завершении InitCodePackage1 выполняется 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>

Полный пример использования Initializer CodePackages

Рассмотрим полный пример использования Initializer CodePackages.

Это важно

В следующем примере предполагается знакомство с созданием приложений контейнеров Windows с помощью Service Fabric и Docker.

В этом примере имеется ссылка на mcr.microsoft.com/windows/nanoserver:1809. Контейнеры Windows Server несовместимы во всех версиях ос узла. Дополнительные сведения см. в статье о совместимости версий контейнеров Windows.

Следующий ServiceManifest.xml основан на фрагменте кода ServiceManifest, описанного ранее. InitCodePackage0, InitCodePackage1 и WorkloadCodePackage представляют контейнеры. При активации сначала выполняется InitCodePackage0 . Он записывает сообщение в файл и завершает работу. Затем выполняется InitCodePackage1 , который также записывает сообщение в файл и завершает работу. Наконец, WorkloadCodePackage начинает выполнение. Он также записывает сообщение в файл, выводит содержимое файла на stdout, а затем непрерывно выполняет команды 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. &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>

В следующем ApplicationManifest.xml описывается приложение на основе ServiceManifest.xml, описанного выше. Обратите внимание, что указывается одна и та же точка монтирования для тома для всех контейнеров, т. е. C:\WorkspaceOnHost смонтировано в C:\WorkspaceOnContainer на всех трёх контейнерах. Чистый эффект заключается в том, что все контейнеры записываются в один файл журнала в том порядке, в котором они активируются.

<?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 содержимое C:\WorkspaceOnHost\log.txt должно быть следующим.

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

Дальнейшие действия

Дополнительные сведения см. в следующих статьях.