Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med Aspire är det möjligt att ange en Dockerfile att bygga när AppHost startas, antingen med tilläggsmetoderna AddDockerfile eller WithDockerfile.
Dessa två metoder har olika syften:
- AddDockerfile: Skapar en ny containerresurs från en befintlig Dockerfile. Använd detta när du vill lägga till en anpassad containerbaserad tjänst i din appmodell.
- WithDockerfile: Anpassar en befintlig containerresurs (till exempel en databas eller cache) för att använda en annan Dockerfile. Använd detta när du vill ändra standardcontaineravbildningen för en Aspire komponent.
Båda metoderna förväntar sig en befintlig Dockerfile i den angivna kontextsökvägen – ingen av metoderna skapar en Dockerfile åt dig.
När du ska använda AddDockerfile jämfört med WithDockerfile
Välj lämplig metod baserat på ditt scenario:
Använd AddDockerfile när:
- Du vill lägga till en anpassad containerbaserad tjänst i din appmodell.
- Du har en befintlig Dockerfile för ett anpassat program eller en anpassad tjänst.
- Du måste skapa en ny containerresurs som inte tillhandahålls av Aspire komponenter.
Använd WithDockerfile när:
- Du vill anpassa en befintlig Aspire komponent (till exempel PostgreSQL, Redisosv.).
- Du måste ersätta standardcontaineravbildningen med en anpassad.
- Du vill behålla det starkt skrivna resursbyggaren och dess tilläggsmetoder.
- Du har specifika krav som standardcontaineravbildningen inte uppfyller.
Lägga till en Dockerfile i appmodellen
I följande exempel används AddDockerfile-utvidgningsmetoden för att specificera en container genom att referera till kontextsökvägen för containerbyggnaden.
var builder = DistributedApplication.CreateBuilder(args);
var container = builder.AddDockerfile(
"mycontainer", "relative/context/path");
Om inte argumentet för kontextsökväg är en rotad sökväg tolkas kontextsökvägen som relativ till katalogen AppHost-projekt (där mappen AppHost *.csproj finns).
Som standard är namnet på den Dockerfile som används Dockerfile och förväntas ligga i katalogen för kontextsökväg. Det går att uttryckligen ange Dockerfile namn antingen som en absolut sökväg eller en relativ sökväg till kontextsökvägen.
Detta är användbart om du vill ändra det specifika Dockerfile som används när du kör lokalt eller när AppHost distribueras.
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");
Anpassa befintliga containerresurser
När du använder AddDockerfile är returvärdet ett IResourceBuilder<ContainerResource>.
Aspire innehåller många anpassade resurstyper som härleds från ContainerResource.
WithDockerfile Med hjälp av tilläggsmetoden kan du ta en befintlig Aspire komponent (till exempel PostgreSQL, Rediseller SQL Server) och ersätta dess standardcontaineravbildning med en anpassad som skapats från din egen Dockerfile. På så sätt kan du fortsätta att använda de starkt skrivna resurstyperna och deras specifika tilläggsmetoder när du anpassar den underliggande containern.
var builder = DistributedApplication.CreateBuilder(args);
// This replaces the default PostgreSQL container image with a custom one
// built from your Dockerfile, while keeping PostgreSQL-specific functionality
var pgsql = builder.AddPostgres("pgsql")
.WithDockerfile("path/to/context")
.WithPgAdmin(); // Still works because it's still a PostgreSQL resource
Överför byggargument
Metoden WithBuildArg kan användas för att skicka argument till containeravbildningsversionen.
var builder = DistributedApplication.CreateBuilder(args);
var container = builder.AddDockerfile("mygoapp", "relative/context/path")
.WithBuildArg("GO_VERSION", "1.22");
Värdeparametern på metoden WithBuildArg kan vara ett literalvärde (boolean, string, int) eller vara en resursbyggare för en parameterresurs. Följande kod ersätter GO_VERSION med ett parametervärde som kan anges vid distributionstillfället.
var builder = DistributedApplication.CreateBuilder(args);
var goVersion = builder.AddParameter("goversion");
var container = builder.AddDockerfile("mygoapp", "relative/context/path")
.WithBuildArg("GO_VERSION", goVersion);
Byggargument motsvarar kommandot ARG i Dockerfiles. Om du expanderar föregående exempel är det här en Dockerfile i flera steg som anger vilken containeravbildningsversion som ska användas som parameter.
# 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"]
Anteckning
I stället för att hårdkoda värden till containeravbildningen rekommenderar vi att du använder miljövariabler för värden som ofta ändras. Detta förhindrar behovet av att återskapa containeravbildningen när en ändring krävs.
Skicka bygghemligheter
Förutom att skapa argument kan man ange bygghemligheter med WithBuildSecret, som görs tillgängliga för enskilda kommandon i Dockerfile genom att använda syntaxen --mount=type=secret på RUN-kommandon.
var builder = DistributedApplication.CreateBuilder(args);
var accessToken = builder.AddParameter("accesstoken", secret: true);
var container = builder.AddDockerfile("myapp", "relative/context/path")
.WithBuildSecret("ACCESS_TOKEN", accessToken);
Tänk till exempel på kommandot RUN i en Dockerfile som exponerar den angivna hemligheten för det specifika kommandot:
# The helloworld command can read the secret from /run/secrets/ACCESS_TOKEN
RUN --mount=type=secret,id=ACCESS_TOKEN helloworld
Försiktighet
Du bör vara försiktig när du skickar hemligheter i byggmiljöer. Detta görs ofta när du använder en autentiseringstoken för att hämta beroenden från privata lagringsplatser eller flöden före en kompilering. Det är viktigt att se till att de inmatade hemligheterna inte kopieras till de slutliga eller mellanliggande bilderna.