-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
83 lines (64 loc) · 2.52 KB
/
Copy pathDockerfile
File metadata and controls
83 lines (64 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Stage 1: Build
FROM python:3.11-slim as builder
# Versão dos pesos YOLOv8. Fixada para builds reproduzíveis.
ARG YOLO_ASSETS_VERSION=v8.4.0
WORKDIR /app
# Instalar dependências do sistema
RUN apt-get update && apt-get install -y --no-install-recommends \
libsm6 \
libxext6 \
libxrender-dev \
libgomp1 \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
# Copiar requirements
COPY requirements.txt .
# Instalar dependências Python em um diretório virtual
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \
pip install --no-cache-dir -r requirements.txt
# Baixar os pesos do YOLOv8 durante o build, para que o container não dependa
# de internet ao iniciar. Falha o build se o download não vier íntegro.
RUN python -c "\
import urllib.request, pathlib, sys; \
url = 'https://github.com/ultralytics/assets/releases/download/${YOLO_ASSETS_VERSION}/yolov8n.pt'; \
dest = pathlib.Path('/opt/yolov8n.pt'); \
urllib.request.urlretrieve(url, dest); \
size = dest.stat().st_size; \
sys.exit(f'Download suspeito: {size} bytes') if size < 5_000_000 else print(f'OK: {size} bytes')"
# Stage 2: Runtime
FROM python:3.11-slim
WORKDIR /app
# Instalar apenas as dependências de runtime necessárias
RUN apt-get update && apt-get install -y --no-install-recommends \
libsm6 \
libxext6 \
libxrender-dev \
libgomp1 \
ffmpeg \
&& rm -rf /var/lib/apt/lists/*
# Copiar venv do builder
COPY --from=builder /opt/venv /opt/venv
# Copiar os pesos do YOLOv8 já baixados no builder
COPY --from=builder /opt/yolov8n.pt /app/yolov8n.pt
# Copiar aplicação
COPY gate_detector_app.py .
# Criar diretório de logs
RUN mkdir -p /app/logs
# Configurar PATH
ENV PATH="/opt/venv/bin:$PATH"
ENV PYTHONUNBUFFERED=1
# Fuso horário: sem isto o container roda em UTC e todo carimbo de hora
# (logs e notificações no Rocket.Chat) sai 3h adiantado do horário local.
# Sobrescrevível pelo .env; o tzdata já vem na imagem base.
ENV TZ=America/Sao_Paulo
# Diretório de config do Ultralytics: /root/.config nem sempre é gravável
# (varia com o isolamento do runtime), e o fallback gera warning a cada boot
ENV YOLO_CONFIG_DIR=/tmp
# Modelo embutido na imagem: sem download no boot, sem dependência de internet
ENV YOLO_MODEL_PATH=/app/yolov8n.pt
# Nenhuma credencial é gravada na imagem: as variáveis vêm do .env em tempo
# de execução (env_file no docker-compose.yml, ou -e / --env-file no docker run)
# Executar aplicação
CMD ["python", "gate_detector_app.py"]