Sdílet prostřednictvím


Kontejnerizujte aplikaci .NET pomocí příkazu dotnet publish

Kontejnery mají mnoho funkcí a výhod, jako je neměnná infrastruktura, poskytuje přenosnou architekturu a umožňuje škálovatelnost. Image se dá použít k vytvoření kontejnerů pro místní vývojové prostředí, privátní cloud nebo veřejný cloud. V tomto kurzu se naučíte kontejnerizovat aplikaci .NET pomocí příkazu dotnet publish bez použití souboru Dockerfile. Dále se dozvíte, jak nakonfigurovat image kontejneru a spuštění a jak vyčistit prostředky.

Spropitné

Pokud vás zajímá použití souboru Dockerfile ke kontejnerizaci aplikace .NET, přečtěte si Kurz: Kontejnerizace aplikace .NET.

Požadavky

Nainstalujte následující požadavky:

Pokud plánujete spuštění kontejneru místně, potřebujete modul runtime kontejneru kompatibilní s open container Initiative (OCI), například:

  • Docker Desktop: Nejběžnější běhové prostředí kontejneru.
  • Podman: otevřená alternativa k Dockeru bez démona.

Důležitý

Sada .NET SDK vytvoří image kontejneru bez Dockeru. Docker nebo Podman jsou potřeba jenom v případě, že chcete image spustit místně. Když ve výchozím nastavení publikovat aplikaci .NET jako image kontejneru, která se nasdílí do místního modulu runtime kontejneru. Alternativně můžete obraz uložit jako tarball nebo jej odeslat přímo do registru kontejnerů bez použití jakéhokoli běhového prostředí kontejneru.

Kromě těchto požadavků se doporučuje, abyste se seznámili se službami pracovních procesů v .NET, protože ukázkový projekt je pracovní proces.

Vytvoření aplikace .NET

K kontejnerizaci potřebujete aplikaci .NET, takže začněte vytvořením nové aplikace ze šablony. Otevřete terminál, vytvořte pracovní složku (sample-directory), pokud jste to ještě neudělali, a změňte adresáře tak, abyste v něm byli. Spuštěním následujícího příkazu v pracovní složce vytvořte nový projekt v podadresáři s názvem Worker:

dotnet new worker -o Worker -n DotNet.ContainerImage

Strom složek vypadá podobně jako v následujícím adresáři:

📁 sample-directory
    └──📂 Worker
        ├──appsettings.Development.json
        ├──appsettings.json
        ├──DotNet.ContainerImage.csproj
        ├──Program.cs
        ├──Worker.cs
        ├──📂 Properties
        │   └─── launchSettings.json
        └──📂 obj
            ├── DotNet.ContainerImage.csproj.nuget.dgspec.json
            ├── DotNet.ContainerImage.csproj.nuget.g.props
            ├── DotNet.ContainerImage.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

Příkaz dotnet new vytvoří novou složku s názvem Worker a vygeneruje pracovní službu, která, když je spuštěná, zapíše každou sekundu do protokolu zprávu. V relaci terminálu změňte adresáře a přejděte do složky Worker. Ke spuštění aplikace použijte příkaz dotnet run.

dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...

Šablona pracovního procesu se trvale smyčuje. Pomocí příkazu zrušit Ctrl+C ho zastavte.

Nastavení názvu image kontejneru

Při publikování aplikace jako kontejneru jsou k dispozici různé možnosti konfigurace. Ve výchozím nastavení je název image kontejneru AssemblyName projektu. Pokud je tento název neplatný jako název image kontejneru, můžete ho přepsat zadáním ContainerRepository, jak je znázorněno v následujícím souboru projektu:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerRepository>dotnet-worker-image</ContainerRepository>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
  </ItemGroup>
</Project>

Pro více informací viz ContainerRepository.

Publikování aplikace .NET

Pokud chcete aplikaci .NET publikovat jako kontejner, použijte následující příkaz dotnet publish:

dotnet publish --os linux --arch x64 /t:PublishContainer

Předchozí příkaz .NET CLI publikuje aplikaci jako kontejner:

  • Cílení na Linux jako operační systém (--os linux).
  • Určení architektury x64 (--arch x64).

Důležitý

Pokud chcete kontejner publikovat místně, musíte mít spuštěný aktivní proces démon kompatibilní s OCI. Pokud není spuštěný při pokusu o publikování aplikace jako kontejneru, dojde k chybě podobné následující:

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

Příkaz dotnet publish vytvoří výstup podobný ukázkovém výstupu:

Restore complete (0.2s)
  DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\

Tento příkaz zkompiluje vaši pracovní aplikaci do složky publish a ve výchozím nastavení odešle image kontejneru do místního démonu Docker. Pokud používáte Podman, můžete použít alias

Publikování aplikace .NET do tarballu

Tarball (nebo soubor tar) je soubor, který obsahuje jiné soubory. Obvykle končí *.tar.gz složenou příponou souboru, která pomáhá indikovat, že se jedná o komprimovaný archiv. Tyto typy souborů se používají k distribuci softwaru nebo k vytváření záloh. V tomto případě se tarball vytvoří pro distribuci image kontejneru.

Pokud chcete publikovat aplikaci .NET jako kontejner do tarballu, použijte následující příkaz:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerArchiveOutputPath=./images/container-image.tar.gz

Předchozí příkaz publikuje aplikaci jako kontejner do tarballu:

  • Cílení na Linux jako operační systém (--os linux).
  • Určení architektury x64 (--arch x64).
  • Nastavení vlastnosti ContainerArchiveOutputPath na ./images/container-image.tar.gz.

Příkaz nevyžaduje spuštěnou OCI-kompatibilní službu. Další informace najdete v tématu ContainerArchiveOutputPath.

Naložte tarball

Běžným případem použití pro export do tarballu jsou organizace zaměřené na bezpečnost. Vytvářejí kontejnery, exportují je jako tar soubory a potom spouštějí nástroje pro skenování zabezpečení přes tyto soubory. Tento přístup zjednodušuje dodržování předpisů, protože zabraňuje složitosti skenování živého systému.

Tarball obsahuje celý kontejner, který pak lze načíst pomocí příslušného nástroje:

  • Docker: docker load -i ./images/container-image.tar.gz
  • Podman: podman load -i ./images/container-image.tar.gz

Publikování aplikace .NET do registru kontejneru

Registry kontejnerů jsou služby, které ukládají a spravují image kontejnerů. Používají se k ukládání a distribuci imagí kontejnerů napříč několika prostředími. Aplikaci .NET můžete publikovat jako kontejner do registru kontejneru pomocí následujícího příkazu:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerRegistry=ghcr.io

Předchozí kód publikuje aplikaci jako kontejner do registru kontejneru:

  • Cílení na Linux jako operační systém (--os linux).
  • Určení architektury x64 (--arch x64).
  • Nastavení vlastnosti ContainerRegistry na ghcr.io.

Další informace najdete v tématu ContainerRegistry.

Vyčištění prostředků

V tomto článku jste publikovali pracovníka .NET jako obraz kontejneru. Pokud chcete, odstraňte tento prostředek. Pomocí příkazu docker images zobrazte seznam nainstalovaných imagí.

docker images

Představte si následující příklad výstupu:

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image    1.0.0     25aeb97a2e21   12 seconds ago   191MB

Spropitné

Soubory obrázků můžou být velké. Obvykle byste při testování a vývoji aplikace odebrali dočasné kontejnery, které jste vytvořili. Pokud plánujete vytvářet další image založené na daném modulu runtime, obvykle zachováte základní image s nainstalovaným modulem runtime.

Pokud chcete image odstranit, zkopírujte ID image a spusťte příkaz docker image rm:

docker image rm 25aeb97a2e21

Další kroky