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