# Multi-stage build for meshcore-bot FROM python:3.11-slim AS builder # Install build dependencies (with cache mount for apt) RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ build-essential \ && rm -rf /var/lib/apt/lists/* # Set working directory WORKDIR /build # Copy dependency files COPY requirements.txt pyproject.toml ./ # Install Python dependencies (with cache mount for pip) RUN --mount=type=cache,target=/root/.cache/pip \ pip install --user -r requirements.txt # Final stage FROM python:3.11-slim # Install runtime dependencies (with cache mount for apt) RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ apt-get update && apt-get install -y --no-install-recommends \ # For serial port access udev \ # For BLE support (optional, but commonly needed) libbluetooth3 \ # Cleanup && rm -rf /var/lib/apt/lists/* # Create non-root user and add to dialout group for serial port access RUN useradd -m -u 1000 -G dialout,tty meshcore && \ mkdir -p /app /data/config /data/databases /data/logs /data/backups && \ chown -R meshcore:meshcore /app /data # Copy Python dependencies from builder COPY --from=builder /root/.local /home/meshcore/.local # Set working directory WORKDIR /app # Version for web viewer footer (set at build time; e.g. --build-arg MESHCORE_BOT_VERSION=v1.2.3) ARG MESHCORE_BOT_VERSION ENV MESHCORE_BOT_VERSION=${MESHCORE_BOT_VERSION} # Copy application files COPY --chown=meshcore:meshcore . /app/ # Set PATH to include user's local bin ENV PATH=/home/meshcore/.local/bin:$PATH \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 # Switch to non-root user USER meshcore # Health check: verify the main process (PID 1, the bot) is still running HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD ["sh", "-c", "kill -0 1"] # Default command CMD ["python3", "meshcore_bot.py", "--config", "/data/config/config.ini"]