Building and Dockerizing a Python Application with Multi-stage Builds

Optimizing Docker Images and Streamlining Python Application Deployment

Building and Dockerizing a Python Application with Multi-stage Builds

Photo by Ian Taylor on Unsplash

Introduction:

In this tutorial, we will explore how to build and Dockerize a Python application using multi-stage builds. Multi-stage builds provide an efficient way to optimize Docker images by separating the build environment from the final production image.

Note: This approach helps reduce the size of the resulting Docker image and ensures that only necessary dependencies are included.

FROM python:3.9-slim AS build

# Install tools required for the project
RUN apt-get update && apt-get install -y git

# List project dependencies with requirements.txt
# This layer is only re-built when requirements.txt is updated
COPY requirements.txt /app/
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt

# Copy the entire project and build it
# This layer is rebuilt when a file changes in the project directory
COPY . /app/

# Set the working directory for the project
WORKDIR /app

# Build the application
RUN python setup.py install

# Stage 2: Final Image
FROM python:3.9-slim

# Copy the built application from the previous stage
COPY --from=build /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages

# Set the working directory for the project
WORKDIR /app

ENTRYPOINT ["python"]
CMD ["app.py"]

In this above Dockerfile:

  1. Build: This stage sets up the build environment. It starts with the python:3.9-slim base image. It installs the necessary tools, copies the requirements.txt file, and installs the project dependencies using pip install. Then, it copies the entire project code and sets the working directory to /app. Finally, it builds the application using python setup.py install.

  2. Final Image: This stage is the final image that will be used to run the Python application. It starts with the python:3.9-slim base image. It copies the built application from the previous stage to the appropriate location in the final image. Then, it sets the working directory to /app and specifies the ENTRYPOINT and CMD to run the app.py file.

Please make sure to adjust the file names (requirements.txt, app.py, setup.py) and the directory structure according to your Python application's specific requirements.

Reference:
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/