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


Добавьте Dockerfiles в модель приложения .NET

С помощью .NET.NET Aspire можно указать Dockerfile для сборки при запуске хоста приложения с использованием методов расширения AddDockerfile или WithDockerfile.

Добавьте Dockerfile в модель приложения

В следующем примере метод расширения AddDockerfile используется для указания контейнера, ссылаясь на путь контекста для сборки контейнера.

var builder = DistributedApplication.CreateBuilder(args);

var container = builder.AddDockerfile(
    "mycontainer", "relative/context/path");

Если аргумент контекстного пути не является корневым путем, путь контекста интерпретируется как относительный к каталогу проектов приложений (где находится папка AppHost *.csproj).

По умолчанию предполагается, что имя Dockerfile, которое используется, — это Dockerfile и оно должно находиться в каталоге пути контекста. Можно явно указать имя Dockerfile либо как абсолютный, либо как относительный путь к контекстному пути.

Это полезно, если вы хотите изменить конкретный код Dockerfile, используемый при запуске на локальной машине или при развертывании хоста приложения.

var builder = DistributedApplication.CreateBuilder(args);

var container = builder.ExecutionContext.IsRunMode
    ? builder.AddDockerfile(
          "mycontainer", "relative/context/path", "Dockerfile.debug")
    : builder.AddDockerfile(
          "mycontainer", "relative/context/path", "Dockerfile.release");

Настройка существующих ресурсов контейнера

При использовании AddDockerfile возвращаемое значение является IResourceBuilder<ContainerResource>. .NET .NET Aspire включает множество пользовательских типов ресурсов, производных от ContainerResource.

С помощью метода расширения WithDockerfile можно продолжать использовать эти строго типизированные типы ресурсов и настраивать используемый базовый контейнер.

var builder = DistributedApplication.CreateBuilder(args);

var pgsql = builder.AddPostgres("pgsql")
                   .WithDockerfile("path/to/context")
                   .WithPgAdmin();

Передача аргументов сборки

Метод WithBuildArg можно использовать для того, чтобы передавать аргументы в сборку образа контейнера.

var builder = DistributedApplication.CreateBuilder(args);

var container = builder.AddDockerfile("mygoapp", "relative/context/path")
                       .WithBuildArg("GO_VERSION", "1.22");

Параметр значения в методе WithBuildArg может быть литеральным значением (boolean, string, int) или может быть построитель ресурсов для ресурса параметров. Следующий код заменяет GO_VERSION значением параметра, которое можно указать во время развертывания.

var builder = DistributedApplication.CreateBuilder(args);

var goVersion = builder.AddParameter("goversion");

var container = builder.AddDockerfile("mygoapp", "relative/context/path")
                       .WithBuildArg("GO_VERSION", goVersion);

Аргументы сборки соответствуют команде ARG в Dockerfiles. Расширяя предыдущий пример, это многоэтапный Dockerfile который указывает определенную версию образа контейнера для использования в качестве параметра.

# Stage 1: Build the Go program
ARG GO_VERSION=1.22
FROM golang:${GO_VERSION} AS builder
WORKDIR /build
COPY . .
RUN go build mygoapp.go

# Stage 2: Run the Go program
FROM mcr.microsoft.com/cbl-mariner/base/core:2.0
WORKDIR /app
COPY --from=builder /build/mygoapp .
CMD ["./mygoapp"]

Заметка

Вместо жесткого преобразования значений в образ контейнера рекомендуется использовать переменные среды для значений, которые часто изменяются. Это позволяет избежать необходимости перестроить образ контейнера при необходимости изменения.

Передача секретов сборки

Помимо аргументов сборки можно указать секреты сборки с помощью WithBuildSecret, которые становятся выборочно доступными для отдельных команд в Dockerfile с помощью синтаксиса --mount=type=secret в командах RUN.

var builder = DistributedApplication.CreateBuilder(args);

var accessToken = builder.AddParameter("accesstoken", secret: true);

var container = builder.AddDockerfile("myapp", "relative/context/path")
                       .WithBuildSecret("ACCESS_TOKEN", accessToken);

Например, рассмотрим команду RUN в Dockerfile, которая предоставляет указанный секрет определенной команде:

# The helloworld command can read the secret from /run/secrets/ACCESS_TOKEN
RUN --mount=type=secret,id=ACCESS_TOKEN helloworld

Осторожность

При передаче секретов в средах сборки следует соблюдать осторожность. Это часто делается при использовании токена для получения зависимостей из частных репозиториев или фидов перед сборкой. Важно убедиться, что внедренные секреты не копируются в окончательные или промежуточные образы.