2026-06-14 16:49:18 +08:00
|
|
|
|
# =============================================================================
|
|
|
|
|
|
# 企微IT智能服务台 — 后端 Docker 镜像构建文件
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
# 说明:基于 Python 3.12 构建后端镜像
|
|
|
|
|
|
# 用法:docker build -t wecom-it-desk-backend .
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
|
|
|
|
# 第一阶段:构建阶段
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
|
|
|
|
FROM python:3.12-slim AS builder
|
|
|
|
|
|
|
|
|
|
|
|
# 设置工作目录
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
|
|
# 安装系统依赖(psycopg2 编译需要 + qrcode 图片处理需要 + healthcheck 需要 curl)
|
|
|
|
|
|
RUN apt-get update && \
|
|
|
|
|
|
apt-get install -y --no-install-recommends gcc libpq-dev libjpeg-dev zlib1g-dev curl && \
|
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 复制依赖声明文件并安装(利用 Docker 层缓存,依赖不变则不重新安装)
|
|
|
|
|
|
# 使用清华大学 PyPI 镜像源,解决公司内网下载 PyPI 官方源超时问题
|
|
|
|
|
|
COPY requirements.txt .
|
|
|
|
|
|
RUN pip install --no-cache-dir \
|
|
|
|
|
|
--timeout 120 \
|
|
|
|
|
|
--retries 5 \
|
|
|
|
|
|
-i https://pypi.tuna.tsinghua.edu.cn/simple/ \
|
|
|
|
|
|
--trusted-host pypi.tuna.tsinghua.edu.cn \
|
|
|
|
|
|
-r requirements.txt
|
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
|
|
|
|
# 第二阶段:运行阶段(更小的镜像体积)
|
|
|
|
|
|
# --------------------------------------------------------------------------
|
|
|
|
|
|
FROM python:3.12-slim
|
|
|
|
|
|
|
|
|
|
|
|
# 设置标签信息
|
|
|
|
|
|
LABEL maintainer="IT服务台开发团队"
|
|
|
|
|
|
LABEL description="企微IT智能服务台后端服务"
|
|
|
|
|
|
|
|
|
|
|
|
# 安装运行时依赖(psycopg2 运行时需要 libpq + healthcheck 需要 curl)
|
|
|
|
|
|
RUN apt-get update && \
|
|
|
|
|
|
apt-get install -y --no-install-recommends libpq5 curl && \
|
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 设置工作目录
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
2026-06-19 12:53:51 +08:00
|
|
|
|
# 🔧 v0.7.0-alpha 修复:显式设置 PYTHONPATH
|
|
|
|
|
|
# 原因:alembic 1.13+ 不默认 prepend cwd,导致 `from app.config import settings` 失败
|
|
|
|
|
|
# 关联:memory/docker-dev-alembic-pythonpath.md(同样问题 dev 环境也中招)
|
|
|
|
|
|
ENV PYTHONPATH=/app
|
|
|
|
|
|
|
2026-06-14 16:49:18 +08:00
|
|
|
|
# 从构建阶段复制已安装的 Python 包
|
|
|
|
|
|
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
|
|
|
|
|
|
COPY --from=builder /usr/local/bin /usr/local/bin
|
|
|
|
|
|
|
2026-06-19 12:53:51 +08:00
|
|
|
|
# 复制项目代码(排除 .env 和 .env.*,避免覆盖 docker-compose 注入的环境变量)
|
2026-06-14 16:49:18 +08:00
|
|
|
|
COPY . .
|
2026-06-19 12:53:51 +08:00
|
|
|
|
# 删除可能被 COPY 进镜像的开发 .env
|
|
|
|
|
|
# 原因:pydantic-settings 会优先读 /app/.env,会覆盖 compose 的 environment 块
|
|
|
|
|
|
# 关联:memory/v070-alpha-backend-env-override-bug.md
|
|
|
|
|
|
RUN rm -f /app/.env /app/.env.* || true
|
2026-06-14 16:49:18 +08:00
|
|
|
|
|
|
|
|
|
|
# 暴露端口
|
|
|
|
|
|
EXPOSE 8000
|
|
|
|
|
|
|
|
|
|
|
|
# 启动命令(Docker Compose 中会覆盖为 alembic upgrade head + uvicorn)
|
|
|
|
|
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|