CodeReview/backend/Dockerfile

115 lines
3.4 KiB
Docker
Raw Normal View History

# ============================================
# 多阶段构建 - 构建阶段
# ============================================
FROM python:3.12-slim AS builder
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 彻底清除代理设置
ENV http_proxy=""
ENV https_proxy=""
ENV HTTP_PROXY=""
ENV HTTPS_PROXY=""
ENV all_proxy=""
ENV ALL_PROXY=""
ENV no_proxy="*"
ENV NO_PROXY="*"
# 清除 apt 代理配置并配置重试,使用阿里云镜像
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null || true && \
rm -f /etc/apt/apt.conf.d/proxy.conf 2>/dev/null || true && \
echo 'Acquire::http::Proxy "false";' > /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::https::Proxy "false";' >> /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::Retries "5";' >> /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::http::Timeout "60";' >> /etc/apt/apt.conf.d/99-no-proxy
# 安装构建依赖gcc 只在构建阶段需要)
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc \
libpq-dev \
libffi-dev \
&& rm -rf /var/lib/apt/lists/*
# 安装 uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# 配置 uv 使用官方 PyPI国内镜像不稳定时使用
ENV UV_INDEX_URL=https://pypi.org/simple/
# 复制依赖文件
COPY pyproject.toml uv.lock README.md ./
# 安装 Python 依赖到虚拟环境
RUN uv sync --frozen --no-dev
# ============================================
# 多阶段构建 - 运行阶段
# ============================================
FROM python:3.12-slim AS runtime
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 彻底清除代理设置
ENV http_proxy=""
ENV https_proxy=""
ENV HTTP_PROXY=""
ENV HTTPS_PROXY=""
ENV all_proxy=""
ENV ALL_PROXY=""
ENV no_proxy="*"
ENV NO_PROXY="*"
# 配置使用阿里云 Debian 镜像源
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null || true
# 清除 apt 代理配置
RUN rm -f /etc/apt/apt.conf.d/proxy.conf 2>/dev/null || true && \
echo 'Acquire::http::Proxy "false";' > /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::https::Proxy "false";' >> /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::Retries "5";' >> /etc/apt/apt.conf.d/99-no-proxy && \
echo 'Acquire::http::Timeout "60";' >> /etc/apt/apt.conf.d/99-no-proxy
# 只安装运行时依赖(不需要 gcc
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libpq5 \
curl \
git \
libpango-1.0-0 \
libpangoft2-1.0-0 \
libpangocairo-1.0-0 \
libcairo2 \
libgdk-pixbuf-2.0-0 \
libglib2.0-0 \
shared-mime-info \
fonts-noto-cjk \
&& fc-cache -fv \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# 从构建阶段复制虚拟环境和 uv
COPY --from=builder /app/.venv /app/.venv
COPY --from=builder /usr/local/bin/uv /usr/local/bin/uv
# 复制应用代码
COPY . .
# 创建上传目录并设置启动脚本权限
RUN mkdir -p /app/uploads/zip_files && \
chmod +x /app/docker-entrypoint.sh
# 暴露端口
EXPOSE 8000
# 启动命令 - 使用启动脚本自动执行数据库迁移
CMD ["/app/docker-entrypoint.sh"]