首页/云/Docker 容器速查/完整示例:前端构建 + Nginx 运行镜像
镜像与构建107 条

完整示例:前端构建 + Nginx 运行镜像

前端静态站的常见两段式 Dockerfile:Node 构建产物,Nginx 提供静态服务;把配置、健康检查与启动命令一并固化。

Docker 容器速查云更新于 2026-10-13

完整示例:前端构建加 Nginx

前端静态站的常见两段式写法:构建阶段用 Node 编译出静态产物,运行阶段用 Nginx 提供服务。配置文件、健康检查与启动命令一并固化进镜像,部署时只依赖镜像本身,环境差异被压到最小。

基本信息

阶段划分Node 构建阶段与 Nginx 运行阶段
配置注入把 nginx 配置复制到 conf.d 目录
端口EXPOSE 80,是否映射到宿主由运行时决定
健康检查用镜像内可用的工具探测本地首页
启动命令保留 nginx 前台运行,否则容器启动即退出

典型使用场景

  • 前端单页应用镜像化:产物与运行环境一起打包,部署只需拉镜像
  • 统一多环境配置:nginx 配置随镜像版本管理,减少现场手工改动
  • 排查单页应用刷新 404:确认配置里有前端路由回退规则
  • 排查容器启动即退出:确认启动命令没有把 nginx 切成后台模式
  • 为静态资源设置缓存策略:区分入口文件与带指纹的资源文件
  • 与反向代理配合时统一上游地址与超时设置,减少环境间差异

示例

示例
FROM node:20-alpine AS build
WORKDIR /site
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:1.27-alpine
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=build /site/dist /usr/share/nginx/html
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -qO- http://localhost/ >/dev/null || exit 1
CMD ["nginx", "-g", "daemon off;"]

# default.conf 里要有前端路由回退,单页应用刷新才不报 404
# location / { try_files $uri $uri/ /index.html; }

各部分的分工

部分职责产物去向
build 阶段装依赖并编译前端/site/dist
runtime 阶段提供静态文件服务/usr/share/nginx/html
运行配置nginx 配置与缓存策略/etc/nginx/conf.d/
健康检查探测本地首页容器健康状态
启动命令前台运行主进程容器主进程
nginx 官方镜像默认已经带前台运行的启动命令;自定义 CMD 时要保留这一点,否则 nginx 转入后台后容器前台没有进程,启动即退出。
构建产物目录名随框架不同(dist、build、out),复制路径要与实际产出一致,否则镜像里的站点目录是空的。
单页应用刷新 404 靠 nginx 配置里的回退规则解决,只复制产物并不会自动获得这个行为。

易错点

  • 单页应用没有配置路由回退,直接访问子路由或刷新页面返回 404
  • 启动命令写错把 nginx 转入后台,容器前台没有进程,表现为启动后立即退出
  • 产物目录路径写错,镜像里的目录为空,访问返回 403 或 404
  • 健康检查使用了镜像里没有的工具(Alpine 基础镜像没有 curl),容器长期处于不健康状态

数据来源与参考

  • Docker 官方文档:Multi-stage builds + nginx 镜像说明(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌