# 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"]