Añadir Dockerfiles a tu modelo de aplicación de .NET
Con
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.