Skillversitas

Docker Python

How to run a Python application in Docker.

Python Dockerfile

# Stage 1: Build
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
COPY . .

# Stage 2: Production
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

docker-compose.yml

version: '3.8'

services:
  api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=config.settings.production
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
    volumes:
      - ./src:/app/src
    networks:
      - app-net

  database:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - app-net

networks:
  app-net:

volumes:
  db-data:

Use Case: Python Django

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]

Everyday Use Case

Case: A developer needs to run a Python app.

# Build
docker build -t python-app .

# Run
docker run -d -p 8000:8000 python-app

# Development
docker run -d -p 8000:8000 -v $(pwd):/app python:3.11-slim python manage.py runserver

Best Practices

  1. Use slim: For a smaller image
  2. Multi-stage build: For production
  3. Non-root user: For security
  4. Health check: For monitoring

Conclusion

Python in Docker is easy to set up. Use a multi-stage build for production and slim for a minimal image.