63 lines
2.1 KiB
Docker
63 lines
2.1 KiB
Docker
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"] |