Контейнеризация приложения .NET с помощью dotnet publish
Контейнеры имеют множество функций и преимуществ, таких как неизменяемая инфраструктура, предоставление переносимой архитектуры и обеспечение масштабируемости. Этот образ можно использовать для создания контейнеров в вашей локальной среде разработки, частном или общедоступном облаке. В этом руководстве описано, как контейнеризировать приложение .NET с помощью команды dotnet publish .
Необходимые компоненты
Установите следующие необходимые компоненты:
- Пакет SDK для .NET 8+
Если у вас установлена платформа .NET, воспользуйтесь командойdotnet --info
, чтобы определить используемую версию пакета SDK. - Docker Community Edition.
- Пакет SDK для .NET 7+
Если у вас установлена платформа .NET, воспользуйтесь командойdotnet --info
, чтобы определить используемую версию пакета SDK. - Docker Community Edition.
В дополнение к этим предварительным требованиям рекомендуется ознакомиться со службами рабочей роли в .NET.
Создание приложения .NET
Чтобы контейнеризировать приложение .NET, сначала создайте новое приложение из шаблона. Откройте терминал, создайте рабочую папку (sample-directory), если вы еще не сделали этого, и измените каталоги, чтобы он был в нем. В рабочей папке выполните следующую команду, чтобы создать проект в подкаталоге с именем Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
Дерево папок выглядит следующим образом:
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
└──📂 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 и создает рабочую службу, которая при выполнении записывает сообщение каждую секунду. В сеансе терминала измените каталоги и перейдите в рабочую папку. Используйте команду dotnet run
, чтобы запустить приложение.
dotnet run
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 10/18/2022 08:56:00 -05: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: 10/18/2022 08:56:01 -05:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 10/18/2022 08:56:02 -05:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 10/18/2022 08:56:03 -05:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Attempting to cancel the build...
Рабочий шаблон циклирует неограниченное время. Остановите его с помощью команды отмены, нажав клавиши CTRL+C.
Добавление пакета NuGet
Пакет NuGet Microsoft.NET.Build.Container в настоящее время требуется для публикации не веб-проектов в качестве контейнера. Чтобы добавить пакет NuGet в рабочий Microsoft.NET.Build.Containers
шаблон, выполните следующую команду dotnet add package :
dotnet add package Microsoft.NET.Build.Containers
Совет
Если вы создаете веб-приложение и используете пакет SDK для .NET 7.0.300 или более поздней версии, пакет не требуется, пакет содержит те же функции, что и в поле.
Задание имени образа контейнера
При публикации приложения в качестве контейнера доступны различные параметры конфигурации.
По умолчанию имя образа контейнера — это AssemblyName
проект. Если это имя недопустимо в качестве имени образа контейнера, его можно переопределить, указав следующий ContainerRepository
файл проекта:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net8.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="8.0.0" />
</ItemGroup>
</Project>
Дополнительные сведения см. в разделе ContainerRepository.
По умолчанию имя образа контейнера — это AssemblyName
проект. Если это имя недопустимо в качестве имени образа контейнера, его можно переопределить, указав (ContainerImageName
устаревшее) или предпочтительный ContainerRepository
, как показано в следующем файле проекта:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerImageName>dotnet-worker-image</ContainerImageName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.NET.Build.Containers" Version="7.0.401" />
</ItemGroup>
</Project>
Дополнительные сведения см. в разделе ContainerImageName.
Публикация приложения .NET
Чтобы опубликовать приложение .NET в качестве контейнера, используйте следующую команду dotnet publish :
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
Предыдущая команда .NET CLI публикует приложение в виде контейнера:
- Назначение Linux в качестве ОС (
--os linux
). - Указание архитектуры x64 (
--arch x64
). - Использование конфигурации выпуска (
-c Release
).
Важно!
Чтобы создать контейнер локально, необходимо запустить управляющую программу Docker. Если при попытке опубликовать приложение как контейнер не выполняется, возникает ошибка, аналогичная следующей:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Совет
В зависимости от типа контейнера приложения параметры командной строки (параметры) могут отличаться. Например, /t:PublishContainer
аргумент требуется только для приложений, отличных от веб-приложений .NET, таких как console
и worker
шаблоны. Для веб-шаблонов замените /t:PublishContainer
аргумент -p:PublishProfile=DefaultContainer
на . Дополнительные сведения см. в статье о сборках контейнеров пакета SDK для .NET, проблема 141.
Команда создает выходные данные, аналогичные примеру выходных данных:
Determining projects to restore...
All projects are up-to-date for restore.
DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\DotNet.ContainerImage.dll
DotNet.ContainerImage -> .\Worker\bin\Release\net8.0\linux-x64\publish\
Building image 'dotnet-worker-image' with tags latest on top of base image mcr.microsoft.com/dotnet/aspnet:8.0
Pushed container 'dotnet-worker-image:latest' to Docker daemon
Determining projects to restore...
All projects are up-to-date for restore.
DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\DotNet.ContainerImage.dll
DotNet.ContainerImage -> .\Worker\bin\Release\net7.0\linux-x64\publish\
Building image 'dotnet-worker-image' with tags 1.0.0 on top of base image mcr.microsoft.com/dotnet/aspnet:7.0
Pushed container 'dotnet-worker-image:1.0.0' to Docker daemon
Эта команда компилирует приложение рабочей роли в папку публикации и отправляет контейнер в локальный реестр Docker.
Настройка образа контейнера
Вы можете управлять многими аспектами созданного контейнера с помощью свойств MSBuild. Как правило, если вы можете использовать команду в Dockerfile для задания какой-то конфигурации, можно сделать то же самое с помощью MSBuild.
Примечание.
Единственными исключениями являются RUN
команды. Из-за того, как создаются контейнеры, их нельзя эмулировать. Если вам нужна эта функция, вам потребуется использовать Dockerfile для создания образов контейнеров.
ContainerArchiveOutputPath
Начиная с .NET 8, можно создать контейнер непосредственно в качестве архива tar.gz . Эта функция полезна, если рабочий процесс не прост и требует, чтобы вы, например, запустите средство сканирования по изображениям, прежде чем отправлять их. После создания архива его можно переместить, проверить или загрузить его в локальную цепочку инструментов Docker.
Чтобы опубликовать в архиве, добавьте ContainerArchiveOutputPath
свойство в dotnet publish
команду, например:
dotnet publish \
-p PublishProfile=DefaultContainer \
-p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz
Можно указать имя папки или путь с определенным именем файла. Если указать имя папки, имя файла, созданное для архивного файла изображения, будет $(ContainerRepository).tar.gz
. Эти архивы могут содержать несколько тегов внутри них, только так как для всех ContainerImageTags
создается один файл.
Конфигурация именования образов контейнера
Образы контейнеров соответствуют определенному соглашению об именовании. Имя образа состоит из нескольких частей, реестра, необязательного порта, репозитория и дополнительного тега и семейства.
REGISTRY[:PORT]/REPOSITORY[:TAG[-FAMILY]]
Например, рассмотрим полное mcr.microsoft.com/dotnet/runtime:8.0-alpine
имя изображения:
mcr.microsoft.com
— реестр (и в этом случае представляет реестр контейнеров Майкрософт).dotnet/runtime
— это репозиторий (но некоторые считают этоuser/repository
).8.0-alpine
является тегом и семейством (семейство является необязательным описателям, который помогает различать упаковку ОС).
Некоторые свойства, описанные в следующих разделах, соответствуют управлению частями созданного имени образа. Рассмотрим следующую таблицу, которая сопоставляет связь между именем образа и свойствами сборки:
Часть имени изображения | Свойство MSBuild | Пример значений |
---|---|---|
REGISTRY[:PORT] |
ContainerRegistry |
mcr.microsoft.com:443 |
PORT |
ContainerPort |
:443 |
REPOSITORY |
ContainerRepository |
dotnet/runtime |
TAG |
ContainerImageTag |
8.0 |
FAMILY |
ContainerFamily |
-alpine |
Часть имени изображения | Свойство MSBuild | Пример значений |
---|---|---|
REGISTRY[:PORT] |
ContainerRegistry |
mcr.microsoft.com:443 |
PORT |
ContainerPort |
:443 |
REPOSITORY |
ContainerImageName |
dotnet/runtime |
TAG |
ContainerImageTag |
8.0 |
В следующих разделах описываются различные свойства, которые можно использовать для управления созданным образом контейнера.
ContainerBaseImage
Свойство базового образа контейнера управляет изображением, используемым в качестве основы для образа. По умолчанию следующие значения выводятся на основе свойств проекта:
- Если проект является автономным, образ
mcr.microsoft.com/dotnet/runtime-deps
используется в качестве базового образа. - Если проект является проектом ASP.NET Core, образ
mcr.microsoft.com/dotnet/aspnet
используется в качестве базового образа. - В противном случае изображение
mcr.microsoft.com/dotnet/runtime
используется в качестве базового образа.
Тег изображения выводится в качестве числового компонента выбранного TargetFramework
элемента. Например, целевой проект net6.0
приводит к 6.0
тегу выводимого базового образа, а net7.0-linux
проект использует 7.0
тег и т. д.
Если вы задаете здесь значение, необходимо задать полное имя изображения, которое будет использоваться в качестве основы, включая любой тег, который вы предпочитаете:
<PropertyGroup>
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0</ContainerBaseImage>
</PropertyGroup>
<PropertyGroup>
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:7.0</ContainerBaseImage>
</PropertyGroup>
ContainerFamily
Начиная с .NET 8, вы можете использовать ContainerFamily
свойство MSBuild для выбора другого семейства образов контейнеров, предоставляемых Корпорацией Майкрософт, в качестве базового образа для приложения. При установке это значение добавляется к концу выбранного тега TFM, изменяя предоставленный тег. Например, чтобы использовать варианты Alpine Linux базовых образов .NET, можно задать ContainerFamily
следующие alpine
значения:
<PropertyGroup>
<ContainerFamily>alpine</ContainerFamily>
</PropertyGroup>
Предыдущая конфигурация проекта приводит к окончательному тегу 8.0-alpine
для приложения для .NET 8-целевого приложения.
Это поле является бесплатным и часто можно использовать для выбора различных дистрибутивов операционной системы, конфигураций пакетов по умолчанию или любого другого варианта изменений базового образа. Это поле игнорируется при ContainerBaseImage
установке. Дополнительные сведения см. в разделе образов контейнеров .NET.
ContainerRuntimeIdentifier
Свойство идентификатора среды выполнения контейнера управляет операционной системой и архитектурой, используемой контейнером, если контейнерBaseImage поддерживает несколько платформ. Например, изображение mcr.microsoft.com/dotnet/runtime
в настоящее время поддерживает linux-x64
linux-arm
и linux-arm64
win10-x64
изображения, находящиеся за одинаковым тегом, поэтому инструментирование должно быть сказано, какой из этих версий вы планируете использовать. По умолчанию это значение имеет значение RuntimeIdentifier
, выбранное при публикации контейнера. Это свойство редко должно быть задано явным образом. Вместо этого используйте -r
параметр для dotnet publish
команды. Если выбранное изображение не поддерживает RuntimeIdentifier
выбранный образ, приводит к ошибке, описывающей runtimeIdentifiers, который поддерживает образ.
Вы всегда можете задать ContainerBaseImage
для свойства полное имя изображения, включая тег, чтобы избежать необходимости использовать это свойство вообще.
<PropertyGroup>
<ContainerRuntimeIdentifier>linux-arm64</ContainerRuntimeIdentifier>
</PropertyGroup>
Дополнительные сведения об идентификаторах среды выполнения, поддерживаемых .NET, см . в каталоге RID.
ContainerRegistry
Свойство реестра контейнеров управляет целевым реестром, куда будет отправлен только что созданный образ. По умолчанию она отправляется в локальную управляемую программу Docker, но можно также указать удаленный реестр. При использовании удаленного реестра, требующего проверки подлинности, проверка подлинности выполняется с помощью известных docker login
механизмов. Дополнительные сведения см. в разделе "Проверка подлинности в реестрах контейнеров" для получения дополнительных сведений . Для конкретного примера использования этого свойства рассмотрим следующий пример XML:
<PropertyGroup>
<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
</PropertyGroup>
Это средство поддерживает публикацию в любом реестре, поддерживающем HTTP API HTTP реестра Docker версии 2. Это включает следующие реестры явным образом (и, скорее всего, гораздо более неявно):
- Реестр контейнеров Azure;
- Реестр эластичных контейнеров Amazon
- Реестр артефактов Google
- Концентратор Docker
- Пакеты GitHub
- Реестр контейнеров, размещенный в GitLab
- Quay.io
Заметки о работе с этими реестрами см. в заметках, относящихся к реестру.
ContainerRepository
Репозиторий контейнеров — это имя самого образа, например dotnet/runtime
или my-app
. По умолчанию AssemblyName
используется проект.
<PropertyGroup>
<ContainerRepository>my-app</ContainerRepository>
</PropertyGroup>
ContainerImageName
Имя образа контейнера определяет имя самого образа, например dotnet/runtime
или my-app
. По умолчанию AssemblyName
используется проект.
<PropertyGroup>
<ContainerImageName>my-app</ContainerImageName>
</PropertyGroup>
Примечание.
Начиная с .NET 8, ContainerImageName
не рекомендуется использовать ContainerRepository
.
Имена изображений состоят из одного или нескольких сегментов с разделителями косой черты, каждый из которых может содержать только буквенно-цифровые символы нижнего регистра, точки, символы подчеркивания и дефисы, и должен начинаться с буквы или числа. Любые другие символы приводят к возникновению ошибки.
ContainerImageTag(s)
Свойство тега образа контейнера управляет тегами, созданными для образа. Указание использования ContainerImageTag
одного тега и для нескольких тегов ContainerImageTags
.
Важно!
При использовании ContainerImageTags
вы в конечном итоге будете использовать несколько изображений, по одному на уникальный тег.
Теги часто используются для ссылки на разные версии приложения, но они также могут ссылаться на разные дистрибутивы операционной системы или даже разные конфигурации.
Начиная с .NET 8, если тег не указан по умолчанию latest
.
По умолчанию Version
проект используется в качестве значения тега.
Чтобы переопределить значение по умолчанию, укажите одно из следующих значений:
<PropertyGroup>
<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
</PropertyGroup>
Чтобы указать несколько тегов, используйте набор тегов с запятой в ContainerImageTags
свойстве, аналогичный настройке нескольких TargetFrameworks
:
<PropertyGroup>
<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
</PropertyGroup>
Теги могут содержать только до 127 буквенно-цифровых символов, периодов, подчеркивания и дефисов. Они должны начинаться с буквенно-цифрового символа или подчеркивания. Любая другая форма приводит к возникновению ошибки.
Примечание.
При использовании ContainerImageTags
теги разделяются символом ;
. Если вы вызываете dotnet publish
из командной строки (как и в большинстве сред CI/CD), вам потребуется внешняя оболочка значений в одном '
и внутреннем оболочке с двойными кавычками"
, например ().='"tag-1;tag-2"'
Рассмотрим следующую dotnet publish
команду:
dotnet publish -p ContainerImageTags='"1.2.3-alpha2;latest"'
Это приводит к созданию двух образов: my-app:1.2.3-alpha2
и my-app:latest
.
Совет
Если у вас возникли проблемы со свойством, рассмотрите возможность определения области переменной ContainerImageTags
ContainerImageTags
среды.
ContainerImageTags='1.2.3;latest' dotnet publish
ContainerLabel
Метка контейнера добавляет метку метаданных в контейнер. Метки не влияют на контейнер во время выполнения, но часто используются для хранения версий и создания метаданных для использования сканерами безопасности и другими средствами инфраструктуры. Можно указать любое количество меток контейнера.
Узел ContainerLabel
имеет два атрибута:
Include
: ключ метки.Value
: значение метки (это может быть пустым).
<ItemGroup>
<ContainerLabel Include="org.contoso.businessunit" Value="contoso-university" />
</ItemGroup>
Список меток, созданных по умолчанию, см . в метках контейнеров по умолчанию.
Настройка выполнения контейнера
Для управления выполнением контейнера можно использовать следующие свойства MSBuild.
ContainerWorkingDirectory
Узел рабочего каталога контейнера управляет рабочим каталогом контейнера, каталогом, который выполняется в ней, если не выполняется другая команда.
По умолчанию /app
значение каталога используется в качестве рабочего каталога.
<PropertyGroup>
<ContainerWorkingDirectory>/bin</ContainerWorkingDirectory>
</PropertyGroup>
ContainerPort
Порт контейнера добавляет порты TCP или UDP в список известных портов для контейнера. Это позволяет средам выполнения контейнеров, таким как Docker, автоматически сопоставлять эти порты с хост-компьютером. Это часто используется в качестве документации для контейнера, но также можно использовать для включения автоматического сопоставления портов.
Узел ContainerPort
имеет два атрибута:
Include
: номер порта для предоставления.Type
: по умолчанию допустимыеtcp
значения имеют значениеtcp
илиudp
.
<ItemGroup>
<ContainerPort Include="80" Type="tcp" />
</ItemGroup>
Начиная с .NET 8, ContainerPort
он выводится при явном указании на основе нескольких известных переменных среды ASP.NET:
ASPNETCORE_URLS
ASPNETCORE_HTTP_PORTS
ASPNETCORE_HTTPS_PORTS
Если эти переменные среды присутствуют, их значения анализируются и преобразуются в сопоставления tcp-портов. Эти переменные среды считываются из базового образа, при наличии или из переменных среды, определенных в проекте, с помощью ContainerEnvironmentVariable
элементов. Дополнительные сведения см. в разделе ContainerEnvironmentVariable.
ContainerEnvironmentVariable
Узел переменной среды контейнера позволяет добавлять переменные среды в контейнер. Переменные среды доступны приложению, работающему в контейнере немедленно, и часто используются для изменения поведения во время выполнения запущенного приложения.
Узел ContainerEnvironmentVariable
имеет два атрибута:
Include
: имя переменной среды.Value
: значение переменной среды.
<ItemGroup>
<ContainerEnvironmentVariable Include="LOGGER_VERBOSITY" Value="Trace" />
</ItemGroup>
Дополнительные сведения см . в разделе переменных среды .NET.
Настройка команд контейнера
По умолчанию средства контейнера запускают приложение с помощью созданного двоичного файла AppHost для вашего приложения (если приложение использует AppHost), или dotnet
команду, а также библиотеку DLL приложения.
Однако вы можете управлять выполнением приложения с помощью некоторых сочетаний ContainerAppCommand
, ContainerAppCommandArgs
а ContainerDefaultArgs
ContainerAppCommandInstruction
также .
Эти разные точки конфигурации существуют, так как разные базовые образы используют различные сочетания контейнеров ENTRYPOINT
и COMMAND
свойств, и вы хотите иметь возможность поддерживать все из них. Значения по умолчанию должны использоваться для большинства приложений, но если вы хотите настроить поведение запуска приложения, необходимо:
- Определите двоичный файл для запуска и задайте его как
ContainerAppCommand
- Определите, какие аргументы необходимы для запуска приложения, и задайте их как
ContainerAppCommandArgs
- Определите, какие аргументы (если таковые имеются) являются необязательными и могут быть переопределены пользователем и задать их как
ContainerDefaultArgs
- Задайте для
ContainerAppCommandInstruction
значениеDefaultArgs
.
Дополнительные сведения см. в следующих элементах конфигурации.
ContainerAppCommand
Элемент конфигурации команды приложения — это логическая точка входа приложения. Для большинства приложений это приложение AppHost, созданный исполняемый двоичный файл для вашего приложения. Если приложение не создает AppHost, эта команда обычно будет выполняться dotnet <your project dll>
. Эти значения применяются после любого ENTRYPOINT
в базовом контейнере или непосредственно, если он не ENTRYPOINT
определен.
Конфигурация ContainerAppCommand
имеет одно Include
свойство, представляющее команду, параметр или аргумент для использования в команде точки входа:
<ItemGroup Label="ContainerAppCommand Assignment">
<!-- This is how you would start the dotnet ef tool in your container -->
<ContainerAppCommand Include="dotnet" />
<ContainerAppCommand Include="ef" />
<!-- This shorthand syntax means the same thing, note the semicolon separating the tokens. -->
<ContainerAppCommand Include="dotnet;ef" />
</ItemGroup>
ContainerAppCommandArgs
Этот элемент конфигурации команды приложения args представляет любые логически необходимые аргументы для приложения, которые должны применяться к нему ContainerAppCommand
. По умолчанию для приложения не создается ни один из них. При наличии к контейнеру применяются args при выполнении.
Конфигурация ContainerAppCommandArgs
имеет одно Include
свойство, представляющее параметр или аргумент для применения к команде ContainerAppCommand
.
<ItemGroup>
<!-- Assuming the ContainerAppCommand defined above,
this would be the way to force the database to update.
-->
<ContainerAppCommandArgs Include="database" />
<ContainerAppCommandArgs Include="update" />
<!-- This is the shorthand syntax for the same idea -->
<ContainerAppCommandArgs Include="database;update" />
</ItemGroup>
ContainerDefaultArgs
Этот элемент конфигурации args по умолчанию представляет любые переопределяемые пользователем аргументы для приложения. Это хороший способ предоставить значения по умолчанию, которые может потребоваться запустить приложение таким образом, чтобы упростить запуск, но по-прежнему легко настроить.
Конфигурация ContainerDefaultArgs
имеет одно Include
свойство, представляющее параметр или аргумент для применения к команде ContainerAppCommand
.
<ItemGroup>
<!-- Assuming the ContainerAppCommand defined above,
this would be the way to force the database to update.
-->
<ContainerDefaultArgs Include="database" />
<ContainerDefaultArgs Include="update" />
<!-- This is the shorthand syntax for the same idea -->
<ContainerDefaultArgs Include="database;update" />
</ItemGroup>
ContainerAppCommandInstruction
Конфигурация инструкций команды приложения помогает управлять способом ContainerEntrypoint
, ContainerEntrypointArgs
а ContainerAppCommand
ContainerAppCommandArgs
также ContainerDefaultArgs
объединяться для формирования окончательной команды, выполняемой в контейнере. Это зависит от того, присутствует ли в ENTRYPOINT
базовом образе. Это свойство принимает одно из трех значений: "DefaultArgs"
, "Entrypoint"
или "None"
.
Entrypoint
:- В этом режиме точка входа определяется
ContainerAppCommand
иContainerAppCommandArgs
ContainerDefaultArgs
.
- В этом режиме точка входа определяется
None
:- В этом режиме точка входа определяется
ContainerEntrypoint
иContainerEntrypointArgs
ContainerDefaultArgs
.
- В этом режиме точка входа определяется
DefaultArgs
:- Это самый сложный режим, если ни один из
ContainerEntrypoint[Args]
элементов отсутствует,ContainerAppCommand[Args]
онContainerDefaultArgs
используется для создания точки входа и команды. Точка входа базового образа для базовых образов с жесткой кодировкойdotnet
или/usr/bin/dotnet
пропускается таким образом, чтобы вы имели полный контроль. - Если оба
ContainerEntrypoint
иContainerAppCommand
есть, тоContainerEntrypoint
становится точкой входа иContainerAppCommand
становится командой.
- Это самый сложный режим, если ни один из
Примечание.
ContainerEntrypointArgs
Элементы ContainerEntrypoint
конфигурации устарели по состоянию на .NET 8.
Важно!
Это для расширенных приложений, большинство пользователей не должны настраивать свою точку входа на эту степень. Дополнительные сведения и если вы хотите предоставить варианты использования для ваших сценариев, см. в статье GitHub: контейнер sdk для .NET создает обсуждения.
ContainerUser
Свойство конфигурации пользователя управляет пользователем по умолчанию, в котором выполняется контейнер. Это часто используется для запуска контейнера в качестве пользователя, не являющегося пользователем, который рекомендуется использовать для обеспечения безопасности. Существует несколько ограничений для этой конфигурации, которые следует учитывать:
- Она может принимать различные формы: имя пользователя, идентификаторы пользователей Linux, имя группы, идентификатор
username:groupname
группы Linux и другие варианты идентификаторов. - На изображении нет проверки наличия указанного пользователя или группы.
- Изменение пользователя может изменить поведение приложения, особенно в отношении таких действий, как разрешения файловой системы .
Значение по умолчанию этого поля зависит от проекта TFM и целевой операционной системы:
- Если вы используете .NET 8 или более поздней версии и используете образы среды выполнения Майкрософт, выполните следующие действия.
- в Linux используется бессерверный пользователь
app
(хотя он ссылается на его идентификатор пользователя) - В Windows используется бессерверный пользователь
ContainerUser
- в Linux используется бессерверный пользователь
- В противном случае значение по умолчанию
ContainerUser
не используется
<PropertyGroup>
<ContainerUser>my-existing-app-user</ContainerUser>
</PropertyGroup>
Совет
Переменная APP_UID
среды используется для задания сведений о пользователе в контейнере. Это значение может поступать из переменных среды, определенных в базовом образе (например, образы Microsoft .NET), или вы можете настроить его самостоятельно с помощью синтаксиса ContainerEnvironmentVariable
.
Однако вы можете управлять выполнением приложения с помощью ContainerEntrypoint
и ContainerEntrypointArgs
.
ContainerEntrypoint
Точку входа контейнера можно использовать для настройки ENTRYPOINT
контейнера, который вызывается при запуске контейнера. По умолчанию для сборок, создающих узел приложения, он устанавливается в качестве ContainerEntrypoint
. Для сборок, которые не создают исполняемый файл, dotnet path/to/app.dll
он используется в качестве ContainerEntrypoint
.
Узел ContainerEntrypoint
имеет один атрибут:
Include
: команда, параметр или аргумент для использования в командеContainerEntrypoint
.
Например, рассмотрим следующую примерную группу элементов проекта .NET:
<ItemGroup Label="Entrypoint Assignment">
<!-- This is how you would start the dotnet ef tool in your container -->
<ContainerEntrypoint Include="dotnet" />
<ContainerEntrypoint Include="ef" />
<!-- This shorthand syntax means the same thing.
Note the semicolon separating the tokens. -->
<ContainerEntrypoint Include="dotnet;ef" />
</ItemGroup>
ContainerEntrypointArgs
Узел точки входа контейнера управляет аргументами по умолчанию, предоставленными для ContainerEntrypoint
узла. Это следует использовать, если ContainerEntrypoint
программа, которую пользователь может использовать самостоятельно. По умолчанию не ContainerEntrypointArgs
создаются от вашего имени.
Узел ContainerEntrypointArg
имеет один атрибут:
Include
: параметр или аргумент для применения к командеContainerEntrypoint
.
Рассмотрим следующий пример группы элементов проекта .NET:
<ItemGroup>
<!-- Assuming the ContainerEntrypoint defined above,
this would be the way to update the database by
default, but let the user run a different EF command. -->
<ContainerEntrypointArgs Include="database" />
<ContainerEntrypointArgs Include="update" />
<!-- This is the shorthand syntax for the same idea -->
<ContainerEntrypointArgs Include="database;update" />
</ItemGroup>
Метки контейнеров по умолчанию
Метки часто используются для предоставления согласованных метаданных на образах контейнеров. Этот пакет предоставляет некоторые метки по умолчанию для повышения удобства обслуживания созданных образов.
org.opencontainers.image.created
имеет формат ISO 8601 текущего UTCDateTime
.
Дополнительные сведения см. в разделе "Реализация обычных меток" поверх существующей инфраструктуры меток.
Очистка ресурсов
В этой статье вы опубликовали рабочую роль .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