71a364a1fd
Dockerfile (multi-arch, python 3.13-slim):
- uv copiato da ghcr.io/astral-sh/uv per install deps
- System deps: libgl1 libglib2.0-0 (cv2) + libgomp1 (numba)
- uv sync --frozen --no-dev da uv.lock
- ENV: IMAGES_DIR=/data/images, HOST=0.0.0.0, PORT=8080
- HEALTHCHECK su GET /images ogni 30s
docker-compose.yml:
- Service pm2d con image ${REGISTRY}/pm2d:${TAG}
- Volume ./images:/data/images (persistenza upload/UI)
- Network esterna 'traefik' (adattare se diverso)
- Labels Traefik:
- Router HTTPS Host(pm.tielogic.xyz) entrypoint websecure TLS letsencrypt
- Middleware bodysize 50MB (upload multipart)
- Redirect HTTP->HTTPS automatico
main.py: HOST/PORT da env (default 127.0.0.1:8080 per dev locale).
README: sezione Deploy con build/push/run su VPS.
.dockerignore: esclude .venv, Test/, benchmarks/, md files.
Build + smoke test container: OK su port 18080.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39 lines
1022 B
Docker
39 lines
1022 B
Docker
FROM python:3.13-slim AS base
|
|
|
|
# uv package manager (copia binario ufficiale)
|
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
|
|
# System deps per opencv (libgl/glib), numba (libgomp)
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libgl1 \
|
|
libglib2.0-0 \
|
|
libgomp1 \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Install deps da lockfile (layer cachato finché pyproject/uv.lock non cambiano)
|
|
COPY pyproject.toml uv.lock ./
|
|
COPY .python-version* ./
|
|
RUN uv sync --frozen --no-dev
|
|
|
|
# Copia sorgenti applicazione
|
|
COPY pm2d ./pm2d
|
|
COPY main.py ./
|
|
|
|
# Defaults (override via docker-compose env)
|
|
ENV IMAGES_DIR=/data/images \
|
|
HOST=0.0.0.0 \
|
|
PORT=8080 \
|
|
PYTHONUNBUFFERED=1
|
|
|
|
# Cartella dati (montata come volume in compose)
|
|
RUN mkdir -p /data/images
|
|
|
|
EXPOSE 8080
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
|
|
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/images').read()" || exit 1
|
|
|
|
CMD ["uv", "run", "python", "main.py"]
|