| name | docker-containerization |
| description | Docker containerization patterns for Python Flask applications with ML models, Tesseract OCR, and React frontends. Use when building, debugging, or deploying Docker containers for the Chuuk Dictionary application. Use when this capability is needed. |
| metadata | {"author":"findinfinitelabs"} |
Docker Containerization
Overview
Docker containerization for the Chuuk Dictionary application including multi-stage builds, ML model packaging, OCR dependencies, and production deployment patterns.
Docker Architecture
chuuk/
├── Dockerfile # Main application container
├── Dockerfile.ollama # Ollama LLM container
├── ollama-entrypoint.sh # Ollama startup script
├── docker-compose.yml # Local development
└── .dockerignore
Main Application Dockerfile
# Multi-stage build for Chuuk Dictionary
# Stage 1: Build React frontend
FROM node:22-slim AS frontend-build
WORKDIR /app/frontend
# Install dependencies first (better caching)
COPY frontend/package*.json ./
RUN npm ci --no-audit
# Build frontend
COPY frontend/ ./
RUN npm run build
# Stage 2: Python application
FROM python:3.11-slim
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PYTHONPATH=/app \
TESSDATA_PREFIX=/usr/share/tesseract-ocr/5/tessdata
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
# Tesseract OCR for image processing
tesseract-ocr \
tesseract-ocr-eng \
# PDF processing
poppler-utils \
# Image libraries
libgl1-mesa-glx \
libglib2.0-0 \
libsm6 \
libxext6 \
libxrender-dev \
# Build tools for some Python packages
gcc \
g++ \
# Clean up
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application code
COPY app.py .
COPY src/ ./src/
COPY config/ ./config/
COPY data/ ./data/
COPY scripts/ ./scripts/
# Copy ML models (large files)
COPY models/ ./models/
# Copy built frontend from Stage 1
COPY --from=frontend-build /app/frontend/dist ./frontend/dist
# Create necessary directories
RUN mkdir -p uploads logs output
# Create non-root user
RUN useradd -m -u 1000 appuser && \
chown -R appuser:appuser /app
USER appuser
# Expose port
EXPOSE 8000
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# Run with Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "2", "--timeout", "300", "app:app"]
Docker Ignore File
# .dockerignore
# Git
.git
.gitignore
.github
# Python
__pycache__
*.py[cod]
*$py.class
.Python
*.so
.pytest_cache
.mypy_cache
*.egg-info
dist/
build/
eggs/
.eggs/
# Virtual environments
venv/
.venv/
ENV/
# Node
frontend/node_modules/
frontend/.vite/
frontend/dist/
# IDE
.vscode/
.idea/
*.swp
*.swo
# Local development
.env
.env.local
*.log
logs/
# Test files
tests/
test_results/
htmlcov/
.coverage
# Documentation
docs/
*.md
!README.md
# Temporary files
*.tmp
*.temp
uploads/*
output/*
Docker Compose for Development
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- FLASK_ENV=development
- COSMOS_CONNECTION_STRING=${COSMOS_CONNECTION_STRING}
- FLASK_SECRET_KEY=${FLASK_SECRET_KEY}
volumes:
- ./app.py:/app/app.py:ro
- ./src:/app/src:ro
- ./uploads:/app/uploads
- ./logs:/app/logs
depends_on:
- ollama
networks:
- chuuk-network
ollama:
build:
context: .
dockerfile: Dockerfile.ollama
ports:
- "11434:11434"
volumes:
- ollama-models:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0
[]
Ollama Container
Dockerfile.ollama
# Dockerfile.ollama
FROM ollama/ollama:latest
# Copy custom model configurations
COPY ollama-modelfile/ /modelfiles/
COPY ollama-entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
ollama-entrypoint.sh
#!/bin/bash
ollama serve &
sleep 10
if [ -f "/modelfiles/chuukese-translator.modelfile" ]; then
echo "Loading Chuukese translator model..."
ollama create chuukese-translator -f /modelfiles/chuukese-translator.modelfile
fi
wait
Building and Running
Build Commands
docker build -t chuuk-dictionary:latest .
docker build -t chuuk-dictionary:v1.0.0 .
docker build --no-cache -t chuuk-dictionary:latest .
docker build --platform linux/amd64 -t chuuk-dictionary:latest .
docker build --target frontend-build -t chuuk-frontend:latest .
Run Commands
docker run -d \
--name chuuk-app \
-p 8000:8000 \
-e COSMOS_CONNECTION_STRING="$COSMOS_CONNECTION_STRING" \
-e FLASK_SECRET_KEY="$FLASK_SECRET_KEY" \
chuuk-dictionary:latest
docker run -d \
--name chuuk-app \
-p 8000:8000 \
-v $(pwd)/uploads:/app/uploads \
-v $(pwd)/logs:/app/logs \
chuuk-dictionary:latest
docker run -it --rm \
-p 8000:8000 \
chuuk-dictionary:latest /bin/bash
docker run -d \
--gpus all \
--name chuuk-app \
-p 8000:8000 \
chuuk-dictionary:latest
Docker Compose Commands
docker-compose up -d
docker-compose up -d --build
docker-compose logs -f app
docker-compose down
docker-compose down -v
docker-compose build app
docker-compose up -d app
Multi-Platform Builds
Build for Azure Container Apps (AMD64)
docker buildx create --name chuuk-builder --use
docker buildx build \
--platform linux/amd64 \
--push \
-t myregistry.azurecr.io/chuuk-dictionary:latest \
.
Build for Multiple Architectures
docker buildx build \
--platform linux/amd64,linux/arm64 \
--push \
-t myregistry.azurecr.io/chuuk-dictionary:latest \
.
Optimization Strategies
Layer Caching
# BAD: Invalidates cache on any code change
COPY . .
RUN pip install -r requirements.txt
# GOOD: Dependencies cached unless requirements change
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
Reduce Image Size
# Use slim base images
FROM python:3.11-slim
# Install and clean in single RUN
RUN apt-get update && apt-get install -y --no-install-recommends \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
# Use --no-cache-dir for pip
RUN pip install --no-cache-dir -r requirements.txt
# Remove build dependencies after use
RUN apt-get purge -y gcc g++ && apt-get autoremove -y
Multi-Stage for ML Models
# Stage 1: Download/prepare models
FROM python:3.11-slim AS model-prep
RUN pip install huggingface_hub
RUN python -c "from huggingface_hub import snapshot_download; \
snapshot_download('Helsinki-NLP/opus-mt-mul-en', cache_dir='/models')"
# Stage 2: Final image
FROM python:3.11-slim
COPY --from=model-prep /models /app/models
Debugging Containers
Inspect Running Container
docker logs chuuk-app
docker logs -f chuuk-app
docker exec -it chuuk-app /bin/bash
docker stats chuuk-app
docker inspect chuuk-app
Debug Build Issues
docker build --progress=plain -t chuuk-dictionary:latest .
docker build --target frontend-build -t debug:latest .
docker history chuuk-dictionary:latest
docker images chuuk-dictionary:latest
Health Checks
docker inspect --format='{{.State.Health.Status}}' chuuk-app
docker inspect --format='{{json .State.Health}}' chuuk-app | jq
Security Best Practices
Non-Root User
# Create user before copying files
RUN useradd -m -u 1000 appuser
# Change ownership
COPY --chown=appuser:appuser . /app
# Switch to non-root user
USER appuser
Secrets Management
# NEVER put secrets in Dockerfile
# BAD
ENV API_KEY=my-secret-key
# GOOD: Use environment variables at runtime
docker run -e API_KEY="$API_KEY" myimage
# BETTER: Use Docker secrets or Azure Key Vault
Scan for Vulnerabilities
docker scout cves chuuk-dictionary:latest
trivy image chuuk-dictionary:latest
Production Considerations
Resource Limits
services:
app:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
Logging Configuration
# Configure logging driver
# In docker-compose.yml or docker run
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Graceful Shutdown
import signal
import sys
def signal_handler(sig, frame):
print('Shutting down gracefully...')
sys.exit(0)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
Common Issues and Solutions
Issue: Large Image Size
docker history --no-trunc chuuk-dictionary:latest
Issue: Slow Builds
DOCKER_BUILDKIT=1 docker build .
docker build --cache-from=myregistry/app:latest .
Issue: Container Won't Start
docker logs chuuk-app
docker run -it chuuk-dictionary:latest /bin/bash
lsof -i :8000
Dependencies
Container includes:
- Python 3.11
- Node.js 22 (build stage)
- Tesseract OCR with English language pack
- Poppler PDF utilities
- OpenCV dependencies
- Gunicorn WSGI server
Source: findinfinitelabs/chuuk — distributed by TomeVault.