Dockerfile 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # ============================================================
  2. # Data Nexus - Dockerfile
  3. # 基于 Python 3.11 slim 镜像,构建轻量级生产容器
  4. # ============================================================
  5. # ---------- 阶段 1:构建依赖 ----------
  6. FROM python:3.11-slim AS builder
  7. WORKDIR /tmp
  8. # 仅拷贝依赖文件,利用 Docker 缓存层
  9. COPY requirements.txt .
  10. # 安装依赖到独立目录,方便后续 COPY --from
  11. RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
  12. # ---------- 阶段 2:最终运行镜像 ----------
  13. FROM python:3.11-slim
  14. # 设置元数据
  15. LABEL maintainer="Data Nexus Team"
  16. LABEL description="Data Nexus - 轻量级数据中台服务"
  17. # 设置环境变量
  18. ENV PYTHONDONTWRITEBYTECODE=1 \
  19. PYTHONUNBUFFERED=1 \
  20. TZ=Asia/Shanghai
  21. # 设置时区(基础镜像已自带 tzdata,无需 apt-get install)
  22. RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
  23. echo "${TZ}" > /etc/timezone
  24. # 创建非 root 用户
  25. RUN groupadd -r appuser && useradd -r -g appuser -d /app -s /sbin/nologin appuser
  26. # 从 builder 阶段复制已安装的 Python 依赖
  27. COPY --from=builder /install /usr/local
  28. # 设置工作目录
  29. WORKDIR /app
  30. # 拷贝应用代码
  31. COPY app/ ./app/
  32. # 创建 storage 目录并设置权限
  33. RUN mkdir -p /data/storage && chown -R appuser:appuser /app /data/storage
  34. # 切换到非 root 用户
  35. USER appuser
  36. # 暴露端口
  37. EXPOSE 8000
  38. # 健康检查(使用 Python 内置模块,无需安装 curl)
  39. HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
  40. CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')" || exit 1
  41. # 启动命令:运行 app/main.py
  42. CMD ["python", "-m", "app.main"]