quivr/backend/Dockerfile
Mohamed Messaad 71d4a63a17
feat(docker): use multi-stage Docker builds for smaller images (#1614)
# Description

Currently, the production Docker images are very large, sitting at 4.17
GB for the frontend image, and 3.49 GB for backend images. This change
adds multi-stage builds, to optimize the image sizes, which results in
the following improvements:

- frontend image size: 4.17 GB -> 1.64 GB
- backend image size: 3.49 GB -> 1.71 GB

I hope this is appropriate as there is no open issue for this that I
know of.
I implemented this change and tested it locally, and would be glad to
discuss this and open an issue if necessary.

## Checklist before requesting a review

Please delete options that are not relevant.

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented hard-to-understand areas
- [x] New and existing unit tests pass locally with my changes

## Screenshots (if appropriate):
Image sizes before:
<img width="1416" alt="image"
src="https://github.com/StanGirard/quivr/assets/8296549/fcbb020f-8165-4549-ae30-823318691ec6">

Image sizes after:
<img width="1416" alt="image"
src="https://github.com/StanGirard/quivr/assets/8296549/d3f43c78-be26-4c38-9d23-9c1b0e9e37f2">
2023-11-13 10:13:56 +01:00

64 lines
1.5 KiB
Docker

# First stage: Build environment
FROM python:3.11-slim-bullseye as builder
ARG DEV_MODE
ENV DEV_MODE=$DEV_MODE
# Install GEOS library, Rust, and other build-time dependencies
RUN apt-get update && apt-get install -y \
libgeos-dev \
libcurl4-openssl-dev \
libssl-dev \
pandoc \
binutils \
curl \
git \
build-essential && \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && \
rm -rf /var/lib/apt/lists/* && apt-get clean
# Add Rust binaries to the PATH
ENV PATH="/root/.cargo/bin:${PATH}"
# Create a virtual environment and activate it
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
WORKDIR /code
# Copy just the requirements first
COPY ./requirements.txt .
# Upgrade pip and install requirements
RUN pip install --upgrade pip && \
pip install --no-cache-dir -r requirements.txt --timeout 200
# Install development tools if in DEV_MODE
RUN if [ "$DEV_MODE" = "true" ]; then pip install --no-cache debugpy --timeout 200; fi
FROM python:3.11-slim-bullseye as runtime
ARG DEV_MODE
ENV DEV_MODE=$DEV_MODE
# Create and activate the virtual environment
ENV PATH="/venv/bin:$PATH"
# Install runtime dependencies
RUN apt-get update && apt-get install -y \
pandoc \
binutils && \
rm -rf /var/lib/apt/lists/* && apt-get clean
WORKDIR /code
# Copy the virtual environment from the builder stage
COPY --from=builder /venv /venv
# Copy the rest of the application
COPY . .
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "5050", "--workers", "6"]