Files
2026-06-25 17:41:06 +08:00

63 lines
2.1 KiB
Docker
Raw Permalink 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.
FROM node:18.12.0-alpine3.16 AS web
WORKDIR /opt/build
COPY /web ./web
RUN npm install pnpm -g --registry=https://registry.npmmirror.com && cd /opt/build/web && pnpm i --registry=https://registry.npmmirror.com && pnpm run build
# === Python 依赖构建阶段(带编译工具)===
FROM python:3.11-slim-bullseye AS builder
# 切换为中科大源
RUN sed -i "s@http://.*.debian.org@http://mirrors.ustc.edu.cn@g" /etc/apt/sources.list \
&& rm -f /etc/apt/apt.conf.d/docker-clean \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apt-get update \
&& apt-get install -y --no-install-recommends gcc python3-dev \
&& rm -rf /var/lib/apt/lists/*
# 创建虚拟环境
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# 安装 Python 依赖(使用阿里云源,避免清华限流)
ADD app ./app
COPY requirements.txt ./app
RUN find app -name "requirement*.txt" | xargs -n 1 pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ -r
FROM python:3.11-slim-bullseye
WORKDIR /opt/backend-server
# 设置时区 & 安装最小运行依赖
RUN sed -i 's@http://.*.debian.org@http://mirrors.ustc.edu.cn@g' /etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends nginx tzdata bash curl \
&& rm -rf /var/lib/apt/lists/* \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
# 从 builder 阶段拷贝已安装的 Python 依赖
COPY --from=builder /opt/venv /opt/venv
# 激活虚拟环境(通过 PATH
ENV PATH="/opt/venv/bin:$PATH"
ENV LANG=zh_CN.UTF-8
# 拷贝应用代码(只拷贝必需目录和文件)
COPY app ./app
COPY static ./static
COPY templates ./templates
COPY run.py .
COPY deploy/entrypoint.sh .
# 拷贝前端产物
COPY --from=web /opt/build/web/dist ./web/dist
# Nginx 配置
COPY deploy/web.conf /etc/nginx/sites-available/web.conf
RUN rm -f /etc/nginx/sites-enabled/default \
&& ln -s /etc/nginx/sites-available/web.conf /etc/nginx/sites-enabled/web.conf; \
python -c "import sys; print(sys.path)"
EXPOSE 80
ENTRYPOINT ["sh", "entrypoint.sh"]