Files
jenkins-pipeline/Dockerfile/python/lessie-email/Dockerfile
2026-01-30 17:49:00 +08:00

70 lines
2.6 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 基础镜像3.12-slim轻量化小镜像
FROM python:3.12-slim as builder
# 构建阶段:隔离构建依赖,最终镜像仅保留运行时,镜像瘦身
WORKDIR /app
# 默认测试环境可通过env修改 development/production
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_SYSTEM_PYTHON=1 \
UV_HTTP_TIMEOUT=600 \
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
UV_EXTRA_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple \
# 可外部覆盖的核心启动参数
APP_ENV=test \
APP_PORT=8031 \
APP_HOST=0.0.0.0 \
# 是否开启热重载:默认关闭(生产/测试环境不需要开发环境可设为1
APP_RELOAD=0 \
# 日志配置文件默认使用json配置可设为空关闭
APP_LOG_CONFIG=logging_config.json
# 安装构建依赖仅builder阶段需要运行时镜像会剔除
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
build-essential \
python3-dev \
&& rm -rf /var/lib/apt/lists/* \
# 清理apt缓存进一步减小构建层体积
&& apt-get clean
# 复制uv和依赖文件**核心缓存层**仅pyproject.toml/uv.lock变更时才重新安装依赖
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
COPY pyproject.toml uv.lock ./
# 安装依赖:--frozen锁定版本--no-dev默认安装生产依赖开发环境可通过uv sync --dev覆盖
# 依赖安装到venv保证隔离性同时支持uv run调用
RUN uv sync --frozen --no-dev
# ==================== 运行时阶段(最终镜像)====================
FROM python:3.12-slim as runtime
# 继承构建阶段的环境变量(可被外部传参覆盖)
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_SYSTEM_PYTHON=1
# 设置工作目录,与构建阶段一致
WORKDIR /app
# 从builder阶段复制仅保留运行时必需的文件依赖+uv剔除所有构建工具
COPY --from=builder /usr/local/bin/uv /usr/local/bin/uv
COPY --from=builder /app/.venv /app/.venv
COPY --from=builder /app/pyproject.toml /app/uv.lock ./
# 复制项目源码(源码变更不影响依赖缓存层,大幅提升构建速度)
COPY . .
# 暴露端口与默认APP_PORT一致
EXPOSE ${APP_PORT}
# 启动脚本用shell脚本解析环境变量动态生成启动命令
CMD ["/bin/sh", "-c", \
"if [ $APP_RELOAD -eq 1 ]; then \
uv run uvicorn app.main:app --host $APP_HOST --port $APP_PORT --reload ${APP_LOG_CONFIG:+-log-config $APP_LOG_CONFIG}; \
else \
uv run uvicorn app.main:app --host $APP_HOST --port $APP_PORT ${APP_LOG_CONFIG:+-log-config $APP_LOG_CONFIG}; \
fi" \
]