Ler em inglês

Compartilhar via


Adicionar Dockerfiles ao modelo de aplicativo .NET

Com .NET.NET Aspire, é possível especificar um Dockerfile para construir quando o host do aplicativo é iniciado, usando os métodos de extensão AddDockerfile ou WithDockerfile.

Adicionar um Dockerfile ao modelo de aplicativo

No exemplo a seguir, o método de extensão AddDockerfile é usado para especificar um contêiner fazendo referência ao caminho de contexto para o build do contêiner.

C#
var builder = DistributedApplication.CreateBuilder(args);

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

A menos que o argumento de caminho de contexto seja um caminho enraizado, o caminho de contexto será interpretado como sendo relativo ao diretório de projetos do host do aplicativo (em que a pasta *.csproj AppHost está localizada).

Por padrão, o nome do Dockerfile que é usado é Dockerfile e deve estar dentro do diretório de caminho de contexto. É possível especificar explicitamente o nome do Dockerfile como um caminho absoluto ou um caminho relativo para o caminho de contexto.

Isso será útil se você quiser modificar o Dockerfile específico que está sendo usado ao executar localmente ou quando o host do aplicativo está em processo de implantação.

C#
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");

Personalizar recursos de contêiner existentes

Ao usar AddDockerfile o valor retornado é um IResourceBuilder<ContainerResource>. .NET .NET Aspire inclui muitos tipos de recursos personalizados derivados de ContainerResource.

Usando o método de extensão WithDockerfile é possível continuar usando esses tipos de recursos fortemente tipados e personalizar o contêiner subjacente que é usado.

C#
var builder = DistributedApplication.CreateBuilder(args);

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

Passar argumentos de compilação

O método WithBuildArg pode ser usado para passar argumentos para a construção de imagem de contêiner.

C#
var builder = DistributedApplication.CreateBuilder(args);

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

O parâmetro de valor no método WithBuildArg pode ser um valor literal (boolean, string, int) ou pode ser um construtor de recursos para um recurso de parâmetro . O código a seguir substitui o GO_VERSION por um valor de parâmetro que pode ser especificado no momento da implantação.

C#
var builder = DistributedApplication.CreateBuilder(args);

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

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

Os argumentos de build correspondem ao comando ARG nos Dockerfiles do . Expandindo o exemplo anterior, este é um Dockerfile de vários estágios que especifica uma versão de imagem de contêiner específica a ser usada como parâmetro.

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"]

Observação

Em vez de codificar valores na imagem de contêiner, é recomendável usar variáveis de ambiente para valores que mudam com frequência. Isso evita a necessidade de recompilar a imagem de contêiner sempre que uma alteração for necessária.

Passar segredos de build

Além de criar argumentos, é possível especificar segredos de compilação usando WithBuildSecret que são disponibilizados seletivamente para comandos individuais no Dockerfile com a sintaxe --mount=type=secret nos comandos RUN.

C#
var builder = DistributedApplication.CreateBuilder(args);

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

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

Por exemplo, considere o comando RUN em um Dockerfile que expõe o segredo especificado ao comando específico:

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

Cuidado

Cuidado deve ser exercido ao passar segredos em ambientes de build. Isso geralmente é feito ao usar um token para recuperar dependências de repositórios ou feeds privados antes de um build. É importante garantir que os segredos injetados não sejam copiados nas imagens finais ou intermediárias.