FROM alpine:latest # Diretório de trabalho WORKDIR /app # UID/GID configuráveis para compatibilizar permissões em bind mounts Linux ARG APP_UID=1000 ARG APP_GID=1000 # Instalar Python no Alpine e criar alias `python` RUN apk add --no-cache python3 py3-pip \ && ln -sf python3 /usr/bin/python # Instalar dependências Python em venv usando build deps temporários COPY requirements.txt . RUN apk add --no-cache --virtual .build-deps \ gcc \ musl-dev \ linux-headers \ && python -m venv /venv \ && /venv/bin/pip install --upgrade pip \ && /venv/bin/pip install --no-cache-dir -r requirements.txt \ && apk del .build-deps # Copiar código da aplicação COPY . . # Criar usuário sem privilégios e diretórios de escrita necessários RUN addgroup -S -g "${APP_GID}" appgroup \ && adduser -S -D -H -u "${APP_UID}" -G appgroup appuser \ && mkdir -p /data /app/logs \ && chown -R appuser:appgroup /app /data /venv # Ambiente padrão ENV PATH="/venv/bin:$PATH" \ FLASK_APP=app.py \ FLASK_ENV=production \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 # Rodar aplicação como usuário não-root USER appuser # Expor a porta que o Flask usa EXPOSE 5000 # Comando para rodar a aplicação CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]