# Multi-stage build for IoT MQTT Bridge # Stage 1: Builder - Install dependencies FROM python:3.11-slim AS builder WORKDIR /app # Install build dependencies RUN apt-get update && \ apt-get install -y --no-install-recommends gcc && \ rm -rf /var/lib/apt/lists/* # Copy requirements and install dependencies COPY requirements.txt . RUN pip install --no-cache-dir --user -r requirements.txt # Stage 2: Runtime - Minimal image FROM python:3.11-slim LABEL maintainer="Open Workshop MQTT IoT Bridge" LABEL description="MQTT Bridge for Odoo IoT Device Integration with Session Detection" LABEL version="1.0.0" WORKDIR /app # Copy installed packages from builder to site-packages (not user directory) COPY --from=builder /root/.local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages # Copy application code COPY *.py ./ COPY config.example.yaml ./ # Create non-root user for security RUN useradd -m -u 1000 bridge && \ chown -R bridge:bridge /app && \ mkdir -p /app/logs /data && \ chown -R bridge:bridge /app/logs /data # Switch to non-root user USER bridge # Environment variables (can be overridden at runtime) ENV BRIDGE_CONFIG=/app/config.yaml \ PYTHONUNBUFFERED=1 \ LOG_LEVEL=INFO \ BRIDGE_PORT=8080 # Expose HTTP Config API port EXPOSE 8080 # Health check via HTTP endpoint HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD python3 -c "import requests; requests.get('http://localhost:8080/health', timeout=3).raise_for_status()" || exit 1 # CMD python -c "import socket; s=socket.socket(); s.connect(('localhost',8080)); s.close()" || exit 1 # Run bridge with unbuffered output CMD ["python", "-u", "main.py"]