Dockerfile 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # ============================================================
  2. # 智能API测试助手 - Docker 镜像配方(Dockerfile)
  3. #
  4. # 思路:一个集装箱装下「能跑起来的完整服务」。
  5. # 你的服务其实只有一个进程:server.py
  6. # - 既当后端(FastAPI,处理 /api/test)
  7. # - 又托管前端(把编译好的 frontend/dist 发给浏览器)
  8. # 所以容器只需要做一件事:让 server.py 跑起来,对外开 8000 端口。
  9. #
  10. # 前端要"编译"成静态文件(需要 Node),后端要"运行"(需要 Python),
  11. # 两个集装箱环境都想要?Docker 的答案是"多阶段构建":
  12. # 阶段一:用 Node 把 Vue 源码编译出 dist 成品
  13. # 阶段二:用 Python 环境把 dist 搬进来,再跑 server.py
  14. # 最终镜像只保留阶段二,阶段一的所有文件都会被丢弃(不占体积)。
  15. # ============================================================
  16. # ---------- 阶段 1:造前端(Node 集装箱) ----------
  17. # 用 node:22-alpine(精简版)而非 node:22:功能足够、体积更小,
  18. # 且本机已缓存该镜像,可避免从 Docker Hub 下载被网络卡住。
  19. FROM node:22-alpine AS frontend-builder
  20. # 工作目录:进了这个集装箱后的默认落点,后面的命令都在这里执行
  21. WORKDIR /build
  22. # 先只复制"依赖清单",然后 npm install。
  23. # 故意拆两步,是为了吃 Docker 缓存:只要 package.json 没变,
  24. # 下次 build 就直接复用上次装好的依赖,不用重新下载几百 MB。
  25. COPY frontend/package.json frontend/package-lock.json ./
  26. RUN npm install
  27. # 再复制全部前端源码,执行编译。Vite 会把成品输出到 /build/dist
  28. COPY frontend/ ./
  29. RUN npm run build
  30. # ---------- 阶段 2:跑后端(Python 集装箱) ----------
  31. FROM python:3.12-slim
  32. # 后端代码统一放在 /app 目录
  33. WORKDIR /app
  34. # 同样的缓存技巧:先装依赖,再拷代码
  35. COPY requirements.txt ./
  36. RUN pip install --no-cache-dir -r requirements.txt
  37. # 复制后端源码(server.py 和 src/ 包)
  38. COPY server.py ./
  39. COPY src/ ./src/
  40. # 关键一步:把阶段一编译出的前端成品搬进 Python 集装箱。
  41. # server.py 里找的是 ./frontend/dist,所以这个目录名不能改。
  42. COPY --from=frontend-builder /build/dist ./frontend/dist
  43. # 只是"说明书":声明容器对外开 8000 端口(真正开不开由运行时 -p 决定)
  44. EXPOSE 8000
  45. # 容器一启动就跑这条命令,等价于你本地 python server.py
  46. # (server.py 内部会调 uvicorn,监听 0.0.0.0:8000)
  47. CMD ["python", "server.py"]