# Stage 1: Build backend FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS backend WORKDIR /repo ARG TARGETPLATFORM RUN case "${TARGETPLATFORM}" in \ "linux/arm64") echo "linux-musl-arm64" > /tmp/rid ;; \ "linux/arm/v7") echo "linux-musl-arm" > /tmp/rid ;; \ *) echo "linux-musl-x64" > /tmp/rid ;; \ esac # Copy project files first for layer caching on restore COPY src/Directory.Build.props src/Directory.Build.targets src/NuGet.config src/stylecop.json src/ COPY src/Targets/ src/Targets/ COPY src/Libraries/ src/Libraries/ COPY src/NzbDrone/Prowlarr.csproj src/NzbDrone/ COPY src/NzbDrone.Common/Prowlarr.Common.csproj src/NzbDrone.Common/ COPY src/NzbDrone.Console/Prowlarr.Console.csproj src/NzbDrone.Console/ COPY src/NzbDrone.Core/Prowlarr.Core.csproj src/NzbDrone.Core/ COPY src/NzbDrone.Host/Prowlarr.Host.csproj src/NzbDrone.Host/ COPY src/NzbDrone.Mono/Prowlarr.Mono.csproj src/NzbDrone.Mono/ COPY src/NzbDrone.SignalR/Prowlarr.SignalR.csproj src/NzbDrone.SignalR/ COPY src/NzbDrone.Update/Prowlarr.Update.csproj src/NzbDrone.Update/ COPY src/NzbDrone.Windows/Prowlarr.Windows.csproj src/NzbDrone.Windows/ COPY src/Prowlarr.Api.V1/Prowlarr.Api.V1.csproj src/Prowlarr.Api.V1/ COPY src/Prowlarr.Http/Prowlarr.Http.csproj src/Prowlarr.Http/ COPY src/ServiceHelpers/ServiceInstall/ServiceInstall.csproj src/ServiceHelpers/ServiceInstall/ COPY src/ServiceHelpers/ServiceUninstall/ServiceUninstall.csproj src/ServiceHelpers/ServiceUninstall/ RUN dotnet restore src/NzbDrone.Console/Prowlarr.Console.csproj -r "$(cat /tmp/rid)" -p:SelfContained=true -p:EnableAnalyzers=false # Copy remaining source and build COPY src/ src/ COPY Logo/ Logo/ COPY LICENSE LICENSE RUN dotnet publish src/NzbDrone.Console/Prowlarr.Console.csproj \ -c Release \ -f net8.0 \ -r "$(cat /tmp/rid)" \ --self-contained \ --no-restore \ -p:EnableAnalyzers=false \ -o /build/bin && \ rm -rf /build/bin/Prowlarr.Update /build/bin/Prowlarr.Windows.* \ /build/bin/ServiceInstall.* /build/bin/ServiceUninstall.* # Stage 2: Build frontend FROM node:20-alpine AS frontend WORKDIR /repo COPY package.json yarn.lock .yarnrc ./ RUN yarn install --frozen-lockfile --network-timeout 120000 COPY frontend/ frontend/ COPY tsconfig.json ./ RUN yarn build --env production # Stage 3: Runtime on hotio base FROM ghcr.io/hotio/base:alpinevpn EXPOSE 9696 ENV WEBUI_PORTS="9696/tcp" RUN apk add --no-cache libintl sqlite-libs icu-libs COPY --from=backend /build/bin ${APP_DIR}/bin COPY --from=frontend /repo/_output/UI ${APP_DIR}/bin/UI ARG VERSION ARG VERSION_BRANCH=develop RUN echo -e "PackageVersion=${VERSION:-local}\nPackageAuthor=[nitrobass24](https://github.com/nitrobass24)\nUpdateMethod=Docker\nBranch=${VERSION_BRANCH}" \ > "${APP_DIR}/package_info" && \ chmod -R u=rwX,go=rX "${APP_DIR}" COPY root/ / RUN find /etc/s6-overlay/s6-rc.d -name "run*" -execdir chmod +x {} +