Контейнеризация приложения .NET с помощью dotnet publish
Контейнеры имеют множество функций и преимуществ, таких как неизменяемая инфраструктура, предоставление переносимой архитектуры и включение масштабируемости. Образ можно использовать для создания контейнеров для локальной среды разработки, частного облака или общедоступного облака. В этом руководстве описано, как контейнеризировать приложение .NET с помощью команды dotnet publish без использования Dockerfile. Кроме того, вы узнаете, как настроить образ контейнера и выполнение, а также как очистить ресурсы.
Советы
Если вы хотите использовать Dockerfile для контейнеризации приложения .NET, ознакомьтесь с руководством: Контейнеризация приложения .NET.
Необходимые условия
Установите следующие предварительные требования:
-
SDK-пакет для .NET 8+
Если вы установили .NET, используйте командуdotnet --info
, чтобы определить, какой пакет SDK вы используете.
Если вы планируете локально запустить контейнер, вам потребуется среда выполнения контейнеров, совместимая с Open Container (OCI), например:
- Docker Desktop: наиболее распространенная среда выполнения контейнеров.
- Podman: бездемонная альтернатива Docker с открытым исходным кодом.
Важный
Пакет SDK для .NET создает образы контейнеров без Docker. Docker или Podman необходимы только в том случае, если вы хотите локально запустить образ. По умолчанию при публикации приложения .NET в качестве образа контейнера он загружается в локальную среду выполнения контейнера. Кроме того, вы можете сохранить образ в виде архива tar или загрузить его непосредственно в реестр контейнеров без использования контейнерной среды вообще.
В дополнение к этим предварительным требованиям рекомендуется ознакомиться с службами-работниками в .NET, так как пример проекта использует рабочие службы.
Создание приложения .NET
Чтобы контейнеризировать приложение .NET, сначала создайте новое приложение из шаблона. Откройте терминал, создайте рабочую папку (образец каталога), если вы еще не сделали этого, и измените каталоги, чтобы он был в нем. В рабочей папке выполните следующую команду, чтобы создать проект в подкаталоге с именем Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
Дерево папок выглядит примерно так, как показано в следующем каталоге:
📁 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
Команда dotnet new
создает новую папку с именем Worker и создает рабочую службу, которая при запуске записывает сообщение каждую секунду. В сеансе терминала измените каталоги и перейдите в папку Worker. Используйте команду 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...
Рабочий шаблон циклирует неограниченное время. Чтобы остановить команду, используйте сочетание клавиш Ctrl+C .
Установите имя образа контейнера
При публикации приложения в качестве контейнера доступны различные параметры конфигурации. По умолчанию имя образа контейнера — это AssemblyName
проекта. Если это имя недопустимо в качестве имени образа контейнера, его можно переопределить, указав ContainerRepository
, как показано в следующем файле проекта:
<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>
Для получения дополнительной информации см. ContainerRepository
.
Публикация приложения .NET
Чтобы опубликовать приложение .NET в качестве контейнера, используйте следующую команду dotnet publish:
dotnet publish --os linux --arch x64 /t:PublishContainer
Предыдущая команда .NET CLI публикует приложение в виде контейнера:
- Назначение Linux в качестве ОС (
--os linux
). - Указание архитектуры x64 (
--arch x64
).
Важный
Чтобы опубликовать контейнер локально, необходимо запустить активную управляющую программу, совместимую с OCI. Если приложение не выполняется при попытке опубликовать приложение в виде контейнера, возникает ошибка, аналогичная следующей:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Команда dotnet publish
создает выходные данные, аналогичные примеру выходных данных:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
Эта команда компилирует приложение рабочий в папку публикации и отправляет образ контейнера в локальный демон Docker по умолчанию. Если вы используете Podman, псевдоним
Публикация приложения .NET в tarball
Tarball (или tar-файл) — это файл, содержащий другие файлы. Обычно он заканчивается *.tar.gz составным расширением файла, чтобы указать, что это сжатый архив. Эти типы файлов используются для распространения программного обеспечения или создания резервных копий. В этом случае созданный tarball используется для распространения образа контейнера.
Чтобы опубликовать приложение .NET в качестве контейнера в tarball, используйте следующую команду:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
Предыдущая команда публикует приложение в виде контейнера в tarball:
- Ориентирование на Linux в качестве ОС (
--os linux
). - Указание архитектуры x64 (
--arch x64
). - Установка свойства
ContainerArchiveOutputPath
в./images/container-image.tar.gz
.
Для команды не требуется запущенная управляющая программа, совместимая с OCI. Дополнительные сведения см. в ContainerArchiveOutputPath
.
Загрузка тарбола
Распространенный вариант использования для экспорта в tarball предназначен для организаций, ориентированных на безопасность. Они создают контейнеры, экспортируют их в виде tar-архивов, а затем запускают инструменты проверки безопасности для этих архивов. Такой подход упрощает соответствие требованиям, так как он позволяет избежать сложностей сканирования динамической системы.
Архив tar содержит весь контейнер, который затем можно загрузить с помощью соответствующего средства:
-
Docker:
docker load -i ./images/container-image.tar.gz
-
Podman:
podman load -i ./images/container-image.tar.gz
Публикация приложения .NET в реестре контейнеров
Реестры контейнеров — это службы, которые хранят образы контейнеров и управляют ими. Они используются для хранения и распространения образов контейнеров в нескольких средах. Приложение .NET можно опубликовать в реестре контейнеров с помощью следующей команды:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
Предыдущий код публикует приложение в качестве контейнера в реестре контейнеров:
- Выбор Linux как ОС (
--os linux
). - Указание архитектуры x64 (
--arch x64
). - Задание свойства
ContainerRegistry
дляghcr.io
.
Дополнительные сведения см. в разделе ContainerRegistry.
Очистка ресурсов
В этой статье вы опубликовали службу .NET в виде образа контейнера. Если вы хотите, удалите этот ресурс. Используйте команду docker images
, чтобы просмотреть список установленных образов.
docker images
Рассмотрим следующий пример выходных данных:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Подсказка
Файлы изображений могут быть большими. Как правило, при тестировании и разработке приложения будут удалены временные контейнеры. Обычно вы храните базовые образы с установленной средой выполнения, если планируете создавать другие образы на базе этой среды выполнения.
Чтобы удалить изображение, скопируйте идентификатор образа и выполните команду docker image rm
:
docker image rm 25aeb97a2e21