# syntax=docker/dockerfile:1.6
# ─────────────────────────────────────────────────────────────
# market_sync 数据同步服务
# 单镜像同时跑：FastAPI dashboard + 进程内 scheduler（worker）
# 部署：docker compose up -d
# ─────────────────────────────────────────────────────────────

# --- builder stage: 装依赖到 venv ---
FROM python:3.11-slim AS builder

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1

# 仅装编译期需要的系统包（很多 wheel 已预编译，但 psycopg2 / cryptography 可能要）
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential gcc libpq-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 先 copy requirements 单独一层（利用 Docker 缓存：依赖不变就不重装）
COPY requirements.txt .
RUN python -m venv /app/.venv \
    && /app/.venv/bin/pip install --upgrade pip \
    && /app/.venv/bin/pip install -r requirements.txt


# --- runtime stage: 极简基础镜像 + 仅复制 venv 与代码 ---
FROM python:3.11-slim AS runtime

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PATH="/app/.venv/bin:${PATH}" \
    PYTHONPATH=/app \
    # service 模式默认监听
    API_HOST=0.0.0.0 \
    API_PORT=8100

# runtime 只需要 psycopg2 的运行时库 + tzdata（pandas tz aware 需要）
RUN apt-get update && apt-get install -y --no-install-recommends \
        libpq5 tzdata curl \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 从 builder 复制 venv（已编译好的依赖）
COPY --from=builder /app/.venv /app/.venv

# 复制应用代码
COPY app/ ./app/
COPY bin/ ./bin/

# 默认启动 service 入口（FastAPI + 进程内 scheduler）
# 也可覆盖为 cli / worker 单跑某个 task：
#   docker compose run --rm market_sync python -m app.entrypoints.cli sync kline_daily
EXPOSE 8100

HEALTHCHECK --interval=60s --timeout=5s --start-period=30s --retries=3 \
    CMD curl -fsS http://localhost:8100/api/health || exit 1

ENTRYPOINT ["/app/bin/service_run.sh"]