Dispatcharr/docker/Dockerfile
2025-05-07 15:32:29 -05:00

158 lines
5.5 KiB
Docker

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 \
DISPATCHARR_BUILD=1
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
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/*
# 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
RUN cd /app && \
pip install --no-cache-dir -r requirements.txt
# Use a dedicated Node.js stage for frontend building
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
FROM python:3.13-slim
ENV PATH="/dispatcharrpy/bin:$PATH" \
VIRTUAL_ENV=/dispatcharrpy \
DJANGO_SETTINGS_MODULE=dispatcharr.settings \
PYTHONUNBUFFERED=1
# 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
# Run collectstatic after frontend assets are copied
RUN cd /app && python manage.py collectstatic --noinput
# Install base dependencies with memory optimization
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
curl \
libpcre3 \
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/*
# Install static FFmpeg 7 binary from John Van Sickle (multi-arch)
RUN set -e && \
# BuildKit's TARGETARCH variable handling for multi-arch builds
if [ -n "$TARGETARCH" ]; then \
if [ "$TARGETARCH" = "amd64" ]; then \
ARCH="x86_64"; \
elif [ "$TARGETARCH" = "arm64" ]; then \
ARCH="arm64"; \
else \
echo "Unsupported architecture: $TARGETARCH" && exit 1; \
fi; \
else \
ARCH=$(uname -m); \
if [ "$ARCH" = "x86_64" ]; then \
ARCH="x86_64"; \
elif [ "$ARCH" = "aarch64" ]; then \
ARCH="arm64"; \
else \
echo "Unsupported architecture: $ARCH" && exit 1; \
fi; \
fi && \
echo "Installing FFmpeg for architecture: $ARCH" && \
mkdir -p /tmp/ffmpeg && \
cd /tmp/ffmpeg && \
FFMPEG_URL="https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-${ARCH}-static.tar.xz" && \
echo "Downloading from $FFMPEG_URL" && \
curl -sSL "$FFMPEG_URL" -o ffmpeg.tar.xz && \
tar -xf ffmpeg.tar.xz && \
ls -la && \
if [ ! -d "ffmpeg-"* ]; then echo "Failed to extract FFmpeg archive"; exit 1; fi && \
cp $(find . -type f -name "ffmpeg") /usr/local/bin/ && \
cp $(find . -type f -name "ffprobe") /usr/local/bin/ && \
chmod +x /usr/local/bin/ffmpeg /usr/local/bin/ffprobe && \
/usr/local/bin/ffmpeg -version && \
/usr/local/bin/ffprobe -version && \
cd / && \
rm -rf /tmp/ffmpeg
# 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/*
# 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/*
WORKDIR /app
CMD ["/app/docker/entrypoint.sh"]