feat(service): dockerize — Dockerfile + docker-compose + 统一入口
把项目打包成可部署的数据同步服务: - Dockerfile (multi-stage builder/runtime, slim base, 含 healthcheck) - docker-compose.yml (postgres:16-alpine + market_sync, 持久化 pgdata + logs) - .dockerignore (减 build context) - bin/service_run.sh (单进程跑 uvicorn + scheduler 线程) - app/entrypoints/worker.py 抽 start_scheduler_thread() (幂等) 部署: docker compose up -d # 然后访问 http://localhost:8100/docs 看 FastAPI 设计选择: - 单容器一服务(uvicorn 主 + scheduler daemon thread),不用 supervisord - 原 systemd timer 由进程内 scheduler 取代(配置已存在于 config 表) - PG 用 docker volume 持久化;同步日志单独 volume
This commit is contained in:
+63
@@ -0,0 +1,63 @@
|
||||
# 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"]
|
||||
Reference in New Issue
Block a user