diff --git a/Dockerfile b/Dockerfile index e22bcf5c..7abcba6a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,17 @@ COPY Iceshrimp.Shared/*.csproj /src/Iceshrimp.Shared/ WORKDIR /src/Iceshrimp.Backend 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 Iceshrimp.Backend/ /src/Iceshrimp.Backend/ @@ -25,20 +35,52 @@ COPY Iceshrimp.Frontend/ /src/Iceshrimp.Frontend/ COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/ # 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 ARG TARGETPLATFORM ARG TARGETARCH -RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi -RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet publish --no-restore -c Release -a $TARGETARCH -o /app-$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 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 FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS builder-aot ARG BUILDPLATFORM 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 # 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 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 Iceshrimp.Backend/ /src/Iceshrimp.Backend/ @@ -59,13 +111,43 @@ COPY Iceshrimp.Frontend/ /src/Iceshrimp.Frontend/ COPY Iceshrimp.Shared/ /src/Iceshrimp.Shared/ # 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 ARG TARGETPLATFORM ARG TARGETARCH -RUN if [[ "$TARGETPLATFORM" != "$BUILDPLATFORM" ]]; then dotnet restore -a $TARGETARCH -p:EnableAOT=true -p:BundleNativeDeps=$VIPS -p:EnableLibVips=$VIPS; fi -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 +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 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 # Enable globalization and time zones: