[docker] Add cache mounts to Dockerfile

This commit is contained in:
Laura Hausmann 2024-07-01 03:32:10 +02:00
parent 04ec9ec5fd
commit ed767ecaff
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -16,7 +16,17 @@ COPY Iceshrimp.Shared/*.csproj /src/Iceshrimp.Shared/
WORKDIR /src/Iceshrimp.Backend WORKDIR /src/Iceshrimp.Backend
ARG VIPS=true ARG VIPS=true
RUN dotnet restore -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
dotnet restore -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS
# copy build files # copy build files
COPY Iceshrimp.Backend/ /src/Iceshrimp.Backend/ COPY Iceshrimp.Backend/ /src/Iceshrimp.Backend/
@ -25,20 +35,52 @@ COPY Iceshrimp.Frontend/ /src/Iceshrimp.Frontend/
COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/ COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/
# build without architecture set, allowing for reuse of the majority of the compiled IL between architectures # build without architecture set, allowing for reuse of the majority of the compiled IL between architectures
RUN dotnet publish --no-restore -c Release -o /build -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
dotnet publish --no-restore -c Release -o /build -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS
# if architecture doesn't match, build with architecture set, otherwise use existing compile output # if architecture doesn't match, build with architecture set, otherwise use existing compile output
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG TARGETARCH ARG TARGETARCH
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi RUN --mount=type=cache,target=/root/.nuget \
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet publish --no-restore -c Release -a $TARGETARCH -o /app-$TARGETARCH -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi --mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi
RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet publish --no-restore -c Release -a $TARGETARCH -o /app-$TARGETARCH -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then mv /app-$TARGETARCH /app; else mv /build /app; fi RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then mv /app-$TARGETARCH /app; else mv /build /app; fi
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS builder-aot FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS builder-aot
ARG BUILDPLATFORM ARG BUILDPLATFORM
WORKDIR /src WORKDIR /src
RUN dotnet workload install wasm-tools RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
dotnet workload install wasm-tools
RUN apt-get update && apt-get install python3 -y RUN apt-get update && apt-get install python3 -y
# copy csproj/fsproj & nuget config, then restore as distinct layers # copy csproj/fsproj & nuget config, then restore as distinct layers
@ -50,7 +92,17 @@ COPY Iceshrimp.Shared/*.csproj /src/Iceshrimp.Shared/
WORKDIR /src/Iceshrimp.Backend WORKDIR /src/Iceshrimp.Backend
ARG VIPS=true ARG VIPS=true
RUN dotnet restore -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
dotnet restore -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS
# copy build files # copy build files
COPY Iceshrimp.Backend/ /src/Iceshrimp.Backend/ COPY Iceshrimp.Backend/ /src/Iceshrimp.Backend/
@ -59,13 +111,43 @@ COPY Iceshrimp.Frontend/ /src/Iceshrimp.Frontend/
COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/ COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/
# build without architecture set, allowing for reuse of the majority of the compiled IL between architectures # build without architecture set, allowing for reuse of the majority of the compiled IL between architectures
RUN dotnet publish --no-restore -c Release -o /build -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
dotnet publish --no-restore -c Release -o /build -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS
# if architecture doesn't match, build with architecture set, otherwise use existing compile output # if architecture doesn't match, build with architecture set, otherwise use existing compile output
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG TARGETARCH ARG TARGETARCH
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi RUN --mount=type=cache,target=/root/.nuget \
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet publish --no-restore -c Release -a $TARGETARCH -o /app-$TARGETARCH -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi --mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi
RUN --mount=type=cache,target=/root/.nuget \
--mount=type=cache,target=/root/.dotnet \
--mount=type=cache,id=Iceshrimp/Backend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/bin \
--mount=type=cache,id=Iceshrimp/Backend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Backend/obj \
--mount=type=cache,id=Iceshrimp/Frontend/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/bin \
--mount=type=cache,id=Iceshrimp/Frontend/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Frontend/obj \
--mount=type=cache,id=Iceshrimp/Shared/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/bin \
--mount=type=cache,id=Iceshrimp/Shared/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Shared/obj \
--mount=type=cache,id=Iceshrimp/Parsing/bin/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/bin \
--mount=type=cache,id=Iceshrimp/Parsing/obj/$BUILDPLATFORM,target=/src/Iceshrimp.Parsing/obj \
if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet publish --no-restore -c Release -a $TARGETARCH -o /app-$TARGETARCH -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi
RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then mv /app-$TARGETARCH /app; else mv /build /app; fi RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then mv /app-$TARGETARCH /app; else mv /build /app; fi
# Enable globalization and time zones: # Enable globalization and time zones: