diff --git a/Dockerfile.app b/Dockerfile.app index 301ed8d..524bbdc 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -1,7 +1,14 @@ # 运行镜像:从 base 提取产物到精简运行时 # 构建命令: docker build -f Dockerfile.app -t aether-app:latest . +# 代码变更只需重建此镜像,无需重建 base FROM aether-base:latest AS builder +WORKDIR /app + +# 复制前端源码并构建 +COPY frontend/ ./frontend/ +RUN cd frontend && npm run build + # ==================== 运行时镜像 ==================== FROM python:3.12-slim @@ -23,7 +30,7 @@ COPY --from=builder /usr/local/bin/gunicorn /usr/local/bin/ COPY --from=builder /usr/local/bin/uvicorn /usr/local/bin/ COPY --from=builder /usr/local/bin/alembic /usr/local/bin/ -# 从 base 镜像复制前端产物 +# 从 builder 阶段复制前端构建产物 COPY --from=builder /app/frontend/dist /usr/share/nginx/html # 复制后端代码 diff --git a/Dockerfile.base b/Dockerfile.base index 59f257d..8f798ce 100644 --- a/Dockerfile.base +++ b/Dockerfile.base @@ -1,6 +1,7 @@ # 构建镜像:编译环境 + 预编译的依赖 # 用于 GitHub Actions CI 构建(不使用国内镜像源) # 构建命令: docker build -f Dockerfile.base -t aether-base:latest . +# 只在 pyproject.toml 或 frontend/package*.json 变化时需要重建 FROM python:3.12-slim WORKDIR /app @@ -19,11 +20,11 @@ RUN mkdir -p src && touch src/__init__.py && \ SETUPTOOLS_SCM_PRETEND_VERSION=0.1.0 pip install --no-cache-dir . && \ pip cache purge -# 前端构建 -COPY frontend/ ./frontend/ -RUN cd frontend && npm ci && npm run build && rm -rf node_modules && npm cache clean --force +# 前端依赖(只安装,不构建) +COPY frontend/package*.json ./frontend/ +RUN cd frontend && npm ci # 产物位置: # - Python 包: /usr/local/lib/python3.12/site-packages # - Python 可执行文件: /usr/local/bin -# - 前端构建产物: /app/frontend/dist +# - 前端 node_modules: /app/frontend/node_modules diff --git a/Dockerfile.base.local b/Dockerfile.base.local index 032d9e2..be126df 100644 --- a/Dockerfile.base.local +++ b/Dockerfile.base.local @@ -1,5 +1,6 @@ # 构建镜像:编译环境 + 预编译的依赖(国内镜像源版本) # 构建命令: docker build -f Dockerfile.base.local -t aether-base:latest . +# 只在 pyproject.toml 或 frontend/package*.json 变化时需要重建 FROM python:3.12-slim WORKDIR /app @@ -22,12 +23,11 @@ RUN mkdir -p src && touch src/__init__.py && \ SETUPTOOLS_SCM_PRETEND_VERSION=0.1.0 pip install --no-cache-dir . && \ pip cache purge -# 前端构建(使用淘宝镜像源) -COPY frontend/ ./frontend/ -RUN cd frontend && npm config set registry https://registry.npmmirror.com && \ - npm ci && npm run build && rm -rf node_modules && npm cache clean --force +# 前端依赖(只安装,不构建,使用淘宝镜像源) +COPY frontend/package*.json ./frontend/ +RUN cd frontend && npm config set registry https://registry.npmmirror.com && npm ci # 产物位置: # - Python 包: /usr/local/lib/python3.12/site-packages # - Python 可执行文件: /usr/local/bin -# - 前端构建产物: /app/frontend/dist +# - 前端 node_modules: /app/frontend/node_modules