|
|
@@ -0,0 +1,65 @@
|
|
|
+# ============================================================
|
|
|
+# 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
|
|
|
+
|
|
|
+# 安装运行时依赖(时区支持)
|
|
|
+RUN apt-get update && \
|
|
|
+ apt-get install -y --no-install-recommends \
|
|
|
+ tzdata \
|
|
|
+ curl && \
|
|
|
+ ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \
|
|
|
+ echo "${TZ}" > /etc/timezone && \
|
|
|
+ apt-get clean && \
|
|
|
+ rm -rf /var/lib/apt/lists/*
|
|
|
+
|
|
|
+# 创建非 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
|
|
|
+
|
|
|
+# 健康检查
|
|
|
+HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
|
|
|
+ CMD curl -f http://localhost:8000/ || exit 1
|
|
|
+
|
|
|
+# 启动命令:运行 app/main.py
|
|
|
+CMD ["python", "-m", "app.main"]
|