diff --git a/docker/Dockerfile b/docker/Dockerfile index 7f7a484f..8acacd1b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,17 +1,17 @@ +# Start from LinuxServer.io's ffmpeg base with glibc 2.38 support +FROM lscr.io/linuxserver/ffmpeg:latest AS base + +# Create a builder stage for Python and your app FROM python:3.13-slim AS builder -# Define build arguments with default values ARG BRANCH=main -# This will be overridden by the GitHub Actions workflow -# when building the Docker image for production. ARG REPO_URL=https://github.com/Dispatcharr/Dispatcharr -# Add timestamp argument ARG TIMESTAMP ENV PATH="/dispatcharrpy/bin:$PATH" \ VIRTUAL_ENV=/dispatcharrpy \ - DJANGO_SETTINGS_MODULE=dispatcharr.settings \ PYTHONUNBUFFERED=1 \ + DJANGO_SETTINGS_MODULE=dispatcharr.settings \ DISPATCHARR_BUILD=1 RUN apt-get update && \ @@ -20,109 +20,54 @@ RUN apt-get update && \ curl \ gcc \ git \ - libpcre3 \ libpcre3-dev \ python3-dev \ wget && \ python -m pip install virtualenv && \ virtualenv /dispatcharrpy && \ git clone -b ${BRANCH} ${REPO_URL} /app && \ - cd /app && \ - rm -rf .git && \ - # Clean apt cache in builder stage - apt-get clean && \ - rm -rf /var/lib/apt/lists/* + cd /app && rm -rf .git -# Update version.py with build timestamp if provided RUN if [ -n "$TIMESTAMP" ]; then \ - echo "Updating timestamp to ${TIMESTAMP} in version.py" && \ - sed -i "s|__timestamp__ = None.*|__timestamp__ = '${TIMESTAMP}' # Set during CI/CD build process|" /app/version.py && \ - cat /app/version.py; \ - fi + sed -i "s|__timestamp__ = None.*|__timestamp__ = '${TIMESTAMP}'|" /app/version.py; fi -RUN cd /app && \ - pip install --no-cache-dir -r requirements.txt +RUN cd /app && pip install --no-cache-dir -r requirements.txt -# Use a dedicated Node.js stage for frontend building +# Node build stage FROM node:20 AS frontend-builder WORKDIR /app/frontend COPY --from=builder /app /app RUN corepack enable && corepack prepare yarn@stable --activate && \ - yarn install && \ - yarn build && \ - find . -maxdepth 1 ! -name '.' ! -name 'dist' -exec rm -rf '{}' \; && \ - # Clean yarn cache to reduce layer size - yarn cache clean + yarn install && yarn build && \ + find . -maxdepth 1 ! -name '.' ! -name 'dist' -exec rm -rf '{}' \; -# Use jrottenberg/ffmpeg as a separate source image for FFmpeg binaries -FROM lscr.io/linuxserver/ffmpeg:latest as ffmpeg - -FROM python:3.13-slim +# Final image +FROM lscr.io/linuxserver/ffmpeg:latest ENV PATH="/dispatcharrpy/bin:$PATH" \ VIRTUAL_ENV=/dispatcharrpy \ - DJANGO_SETTINGS_MODULE=dispatcharr.settings \ - PYTHONUNBUFFERED=1 + PYTHONUNBUFFERED=1 \ + DJANGO_SETTINGS_MODULE=dispatcharr.settings -# Copy the virtual environment and application from the builder stage -COPY --from=builder /dispatcharrpy /dispatcharrpy -COPY --from=builder /app /app -COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist -# Copy FFmpeg binaries from the ffmpeg stage -# Add the necessary libraries and binaries from the FFmpeg image -COPY --from=ffmpeg /usr/local/bin/ffmpeg /usr/local/bin/ffmpeg -COPY --from=ffmpeg /usr/local/bin/ffprobe /usr/local/bin/ffprobe -COPY --from=ffmpeg /usr/local/lib/ /usr/local/lib/ - -# Run collectstatic after frontend assets are copied -RUN cd /app && python manage.py collectstatic --noinput - -# Install base dependencies with memory optimization +# Install required packages for Django RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - curl \ - libpcre3 \ + apt-get install -y --no-install-recommends \ libpq-dev \ nginx \ procps \ streamlink \ - wget \ - gnupg2 \ - lsb-release \ - libva-drm2 \ - libva-x11-2 \ - libva-dev \ - libva-wayland2 \ - vainfo \ - i965-va-driver \ - intel-media-va-driver \ - mesa-va-drivers && \ - cp /app/docker/nginx.conf /etc/nginx/sites-enabled/default && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* + redis-server \ + postgresql-14 \ + postgresql-contrib-14 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* -# Set up Redis repository in a separate step -RUN curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg && \ - chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg && \ - echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list && \ - apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y redis-server && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +COPY --from=builder /dispatcharrpy /dispatcharrpy +COPY --from=builder /app /app +COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist -# Set up PostgreSQL repository and install in a separate step -RUN echo "=== setting up postgres ====" && \ - sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' && \ - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /usr/share/keyrings/postgresql-keyring.gpg && \ - echo "deb [signed-by=/usr/share/keyrings/postgresql-keyring.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \ - apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y postgresql-14 postgresql-contrib-14 && \ - mkdir -p /data && \ - apt-get remove -y gnupg2 lsb-release && \ - apt-get clean && \ - apt-get autoremove -y && \ - rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* +RUN cd /app && python manage.py collectstatic --noinput && \ + cp /app/docker/nginx.conf /etc/nginx/sites-enabled/default WORKDIR /app -CMD ["/app/docker/entrypoint.sh"] +CMD ["/app/docker/entrypoint.sh"] \ No newline at end of file