# ===================================================================== # 翼云Hub · LAOP-web 前端镜像 Dockerfile # 多阶段构建:阶段1 用 Node 构建 Vite 产物;阶段2 用 nginx 提供静态服务 # -------------------------------------------------------------------- # 说明: # - 前端是 Vue3 + Vite SPA,构建产物为 dist/ 静态文件 # - 运行时只需 nginx 提供静态服务 + 反向代理后端 API # - 与后端 laop-admin 容器通过 docker 网络互通,nginx 用 service name 解析 # - 挂载宿主机 /home/laop/web 时,首次启动会自动从镜像内置备份初始化 # 静态目录,避免空挂载导致 nginx 403 # ===================================================================== # ------------------------------------------------------------------- # 阶段1:构建期(Node + Vite) # ------------------------------------------------------------------- FROM node:20-alpine AS builder WORKDIR /app # 先 COPY 依赖描述文件,利用 Docker 缓存层加速安装 COPY package.json package-lock.json ./ # 安装依赖(使用 npm ci 保证可重复构建) RUN npm ci # 复制源码 COPY . . # 构建生产环境产物(Vite 会自动读取 .env.production) RUN npm run build # ------------------------------------------------------------------- # 阶段2:运行期(nginx 静态服务) # ------------------------------------------------------------------- FROM nginx:stable-alpine LABEL maintainer="laop-web" LABEL description="翼云Hub · 无人机信息开放平台 前端 Web 服务" # 时区设置 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 清空 nginx 默认配置,使用自定义配置(包含 SPA 路由 + API 反向代理) RUN rm /etc/nginx/conf.d/default.conf COPY nginx.conf /etc/nginx/conf.d/default.conf # 拷贝构建产物到备份目录(运行时由 entrypoint 脚本复制到 nginx 静态目录) # 不直接放到 /usr/share/nginx/html 是为了支持宿主机目录挂载: # 挂载点会覆盖 /usr/share/nginx/html,但 /app/dist-backup 不受影响 COPY --from=builder /app/dist /app/dist-backup # 注册初始化脚本到 nginx entrypoint 自动执行目录(/docker-entrypoint.d/*.sh) # nginx 官方镜像 entrypoint 会按文件名顺序执行该目录下所有 .sh 脚本 COPY docker-entrypoint.d/30-init-static.sh /docker-entrypoint.d/30-init-static.sh RUN chmod +x /docker-entrypoint.d/30-init-static.sh # 容器内暴露 80 端口(由 docker-compose 映射到宿主机 18080) EXPOSE 80