# REVIVE ONNX 推理参考镜像
#
# 镜像里**不打包模型**：bundle 在运行时挂进来。模型进镜像意味着换一版模型就要重新构建、
# 重新推送、重新拉取，而且镜像里带着的那份产物会和它的来源 run 目录逐渐失联。
#
# 构建：
#   docker build -t revive-onnx-serve revive/deploy/onnxruntime
#
# 运行（把 run 目录挂到 /models 只读）：
#   docker run --rm -p 8000:8000 \
#     -v "$PWD/logs/my_run/models:/models:ro" \
#     revive-onnx-serve --bundle /models/policy.onnx.json
#
# 基础镜像用 slim 而不是 alpine：onnxruntime 只发 manylinux wheel，alpine 的 musl
# 上装不了，得从源码编译。
FROM python:3.12-slim

# 不写 .pyc、日志不缓冲——容器里 stdout 是管道，缓冲会让日志迟迟不出现。
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY bundle_contract.py revive_runtime.py serve.py ./

# 非 root 运行。推理服务不需要写任何东西，模型也是只读挂载。
RUN useradd --create-home --uid 10001 serve
USER serve

EXPOSE 8000

# --host 0.0.0.0：容器里监听 127.0.0.1 等于谁都连不上。
ENTRYPOINT ["python", "serve.py", "--host", "0.0.0.0", "--port", "8000"]
CMD ["--bundle", "/models"]
