Compartir a través de


Añadir Dockerfiles a tu modelo de aplicación de .NET

Con es posible especificar un compilar cuando se inicia el host de la aplicación mediante los métodos de extensión o .

Adición de un Dockerfile al modelo de aplicación

En el siguiente ejemplo, se utiliza el método de extensión AddDockerfile para especificar un contenedor, refiriéndose a la ruta de acceso de contexto para la compilación del contenedor.

var builder = DistributedApplication.CreateBuilder(args);

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

A menos que el argumento de ruta de acceso de contexto sea una ruta de acceso raíz, la ruta de acceso de contexto se interpreta como relativa al directorio de proyectos host de la aplicación (donde se encuentra la carpeta *.csproj AppHost).

De forma predeterminada, el nombre del Dockerfile que se utiliza es Dockerfile y se espera que esté dentro del directorio del camino de contexto. Es posible especificar explícitamente el nombre Dockerfile como una ruta absoluta o una ruta relativa al contexto.

Esto resulta útil si desea modificar el Dockerfile específico que se está utilizando al ejecutarse localmente o cuando se está desplegando el host de la aplicación.

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

Personalización de los recursos de contenedor existentes

Cuando se usa AddDockerfile el valor devuelto es un IResourceBuilder<ContainerResource>. .NET .NET Aspire incluye muchos tipos de recursos personalizados derivados de ContainerResource.

Con el método de extensión WithDockerfile es posible seguir usando estos tipos de recursos fuertemente tipados y personalizar el contenedor subyacente que se usa.

var builder = DistributedApplication.CreateBuilder(args);

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

Pasar argumentos de compilación

El método WithBuildArg se puede usar para pasar argumentos a la construcción de la imagen del contenedor.

var builder = DistributedApplication.CreateBuilder(args);

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

El parámetro value del método WithBuildArg puede ser un valor literal (boolean, string, int) o puede ser un generador de recursos para un recurso de parámetro de . El código siguiente reemplaza el GO_VERSION por un valor de parámetro que se puede especificar en el momento de la implementación.

var builder = DistributedApplication.CreateBuilder(args);

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

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

Los argumentos de compilación corresponden al comando ARG en Dockerfiles. Al expandir el ejemplo anterior, se trata de un Dockerfile de varias fases que especifica una versión específica de la imagen de contenedor que se va a usar como parámetro.

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

Nota

En lugar de codificar valores de forma rígida en la imagen de contenedor, se recomienda usar variables de entorno para los valores que cambian con frecuencia. Esto evita la necesidad de recompilar la imagen de contenedor siempre que se requiera un cambio.

Transferencia de secretos de compilación

Además de los argumentos de construcción, es posible especificar secretos de construcción mediante WithBuildSecret, que están disponibles de forma selectiva para los comandos individuales de la Dockerfile, utilizando la sintaxis de --mount=type=secret en los comandos 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);

Por ejemplo, considere el comando RUN en un Dockerfile que expone el secreto especificado al comando específico:

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

Cautela

Se debe tener precaución al compartir secretos en entornos de compilación. Esto suele hacerse cuando se usa un token para recuperar dependencias de repositorios privados o fuentes antes de una compilación. Es importante asegurarse de que los secretos insertados no se copien en las imágenes finales o intermedias.