From 0ec6c2e3b36084153d14b07efab96932c5817a3d Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sat, 22 Feb 2025 01:10:07 -0800 Subject: [PATCH] Dockerfile: add from_source version as reference --- Dockerfile.from_source | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 Dockerfile.from_source diff --git a/Dockerfile.from_source b/Dockerfile.from_source new file mode 100644 index 0000000..ba14024 --- /dev/null +++ b/Dockerfile.from_source @@ -0,0 +1,110 @@ +ARG YTDLP_VERSION='2024.03.10' +ARG MPV_VERSION='0.39' + +# Build stage for Node.js application +FROM --platform=$TARGETPLATFORM node:23-alpine AS node-builder + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +COPY frontend/package*.json ./frontend/ + +# Install dependencies +RUN npm ci +RUN cd frontend && npm ci + +# Copy source files +COPY . . + +# Build frontend and backend +RUN npm run build + +# Build stage for mpv +FROM --platform=$TARGETPLATFORM alpine AS mpv-builder + +# Install build dependencies for mpv +RUN apk add --no-cache \ + git \ + python3 \ + python3-dev \ + py3-pip \ + meson \ + ninja \ + pkgconfig \ + gcc \ + g++ \ + musl-dev \ + make \ + ffmpeg-dev \ + mesa-dev \ + alsa-lib-dev \ + libplacebo-dev \ + libass-dev \ + lua \ + lua-dev \ + pulseaudio-dev + +# Clone and build mpv +ARG MPV_VERSION +WORKDIR /src +RUN git clone --depth 1 -b release/${MPV_VERSION} https://github.com/mpv-player/mpv.git && \ + cd mpv && \ + meson setup build --prefix=/tmp/mpv-prefix && \ + meson compile -C build && \ + meson install -C build && \ + tar -czf /tmp/mpv-install.tar.gz -C /tmp/mpv-prefix . + +# Build stage for yt-dlp +FROM --platform=$TARGETPLATFORM python:3.11-alpine AS ytdlp-builder + +# Install build dependencies for yt-dlp +RUN apk add --no-cache \ + git \ + make \ + py3-pip \ + python3-dev \ + gcc \ + musl-dev + +# Clone and build yt-dlp +ARG YTDLP_VERSION +WORKDIR /build +RUN git clone https://github.com/yt-dlp/yt-dlp.git --single-branch --branch ${YTDLP_VERSION} . +RUN python3 devscripts/install_deps.py --include pyinstaller +RUN python3 devscripts/make_lazy_extractors.py +RUN python3 -m bundle.pyinstaller --name=yt-dlp + +# Production stage +FROM --platform=$TARGETPLATFORM alpine:latest + +# Install runtime dependencies +RUN apk add --no-cache \ + python3 \ + ffmpeg \ + mesa \ + alsa-lib \ + pulseaudio \ + pulseaudio-utils \ + libstdc++ \ + ca-certificates \ + npm + +WORKDIR /app + +# Install only production dependencies for Node.js +COPY package*.json ./ +RUN npm ci --production + +# Copy built files from previous stages +COPY --from=node-builder /app/build ./build +COPY --from=node-builder /app/frontend/dist ./dist/frontend +COPY --from=ytdlp-builder /build/dist/yt-dlp /usr/bin/ + +COPY --from=mpv-builder /tmp/mpv-install.tar.gz /tmp/ +RUN tar -xzf /tmp/mpv-install.tar.gz -C / && \ + rm /tmp/mpv-install.tar.gz + +EXPOSE 3000 +CMD ["node", "build/server.js"] +