feat(docker): restructure Dockerfile for multi-stage build

Update the Dockerfile to implement a multi-stage build process. 
Introduce a dedicated FFmpeg stage and separate development, build, 
and production stages to optimize image size and improve build 
efficiency. Add necessary dependencies and configure the 
environment for better performance. Update the .dockerignore 
to exclude sensitive files and unnecessary directories.
This commit is contained in:
lumin 2024-12-27 22:56:32 +09:00 committed by GitButler
parent 125e206047
commit 5b811fd66a
2 changed files with 59 additions and 16 deletions

View file

@ -1 +1,9 @@
*
**/coverage
**/.env
**/.aws
**/.ssh
Dockerfile
docker-compose.yml
**/.DS_Store
**/venv
**/env

View file

@ -1,23 +1,58 @@
FROM python:3.13-slim-bullseye
# FFmpeg stage
FROM jrottenberg/ffmpeg:4.1-scratch AS ffmpeg
USER root
# Development stage
FROM python:3.13-bullseye AS development
ARG INSTALL_GIT=false
RUN if [ "$INSTALL_GIT" = "true" ]; then \
apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*; \
fi
COPY --from=ffmpeg / /
# Runtime dependency
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1
# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
build-essential \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip install markitdown
RUN pip install --no-cache-dir hatch
WORKDIR /app
COPY . /app/
# Build stage
FROM python:3.13-bullseye AS build
# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir hatch
WORKDIR /app
COPY pyproject.toml /app/
COPY . /app/
RUN hatch build
# Production stage
FROM python:3.13-slim-bullseye AS production
# Copy ffmpeg binaries
COPY --from=ffmpeg / /
WORKDIR /app
COPY --from=build /app/dist /tmp/dist
RUN pip install --no-cache-dir /tmp/dist/markitdown-*.whl
# Default USERID and GROUPID
ARG USERID=10000
ARG GROUPID=10000
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
USER $USERID:$GROUPID
ENTRYPOINT [ "markitdown" ]
# Entrypoint
ENTRYPOINT ["markitdown"]