dockerfile构建ssr nuxt.js+pm2管理器镜像

6 阅读2分钟

📂 项目结构(示例) ssr-app/

├── app.vue

├── composables

├── dist -> /Users/mac/projects/navigations/.output/public

├── dockerfile

├── ecosystem.config.cjs

├── ecosystem.config.js

├── .env.development

├── .env.production

├── .git

├── .gitignore

├── js

├── nuxt.config.ts

├── package.json

├── pages

├── plugins

├── public

├── README.md

├── server

├── tsconfig.json

└── utils

构建build打包后结构

├── app.vue

├── composables

├── dist -> /Users/mac/projects/navigations/.output/public

├── Dockerfile # 容器构建文件

├── ecosystem.config.cjs # PM2配置文件

├── .env.development

├── .env.production

├── .git

├── .gitignore

├── .output

│ └── server # SSR服务端代码

│ └── index.mjs # 服务入口文件

├── js

├── nuxt.config.ts

├── package.json # 项目依赖

├── pages

├── plugins

├── public

├── README.md

├── server

├── tsconfig.json

└── utils

Dockerfile

FROM node:23.10
# ↑ node:23.10 基础镜像,确保最终镜像纯净


WORKDIR /app
# ↑ 设置容器内工作目录为/app

RUN npm install -g pm2@latest
# ↑ 全局安装PM2进程管理器:
#   - pm2-runtime专为容器优化
#   @latest:明确版本避免缓存问题

COPY . .
# ↑ 复制从远程仓库pull下来的所有文件和目录到容器的工作目录
COPY .env.development ./
COPY .env.production ./

COPY ecosystem.config.cjs ./
# ↑ 复制PM2配置文件
RUN npm install
# ↑ 安装生产依赖(不装devDependencies)
# RUN npm install --production
# --production:仅安装dependencies

RUN npm run build
# ↑ 执行构建命令(假设package.json中有build脚本)
# 典型SSR框架构建命令:
# Next.js: next build
# Nuxt.js: nuxt build

EXPOSE 3117
# ↑ 声明容器监听端口(需与SSR服务端口一致)
# 注意:实际映射需在docker run时用-p参数指定

CMD ["pm2-runtime", "start", "ecosystem.config.cjs"]
# ↑ 容器启动命令:
#   pm2-runtime:专为容器设计的PM2模式
#   ecosystem.config.cjs:PM2配置文件路径

📜 ecosystem.config.cjs 配置解析 示例

module.exports = {
  apps: [{
    name: 'ssr-server',      
    script: './.output/server/index.mjs', 
    exec_mode: 'fork',    
    autorestart: true,       
    watch: false,            
    max_memory_restart: '1G',
    env: {                   
      NODE_ENV: 'prod',
      PORT: 3117             
    },
    args: 'start',           
    cwd: '/app'              
  }]
}

🛠️ 构建与运行命令详解

  1. 构建镜像 docker build -t ssr-app . -t ssr-app:给镜像打标签(名称) . :基于当前目录的Dockerfile构建

  2. 运行容器
    docker run -d \
    -p 3000:3000 \
    --name ssr-container \
    --memory=1g \
    --cpus=2 \
    ssr-app \

-d:后台运行
-p 主机端口:容器端口
--name:容器名称
--memory:限制内存1GB
--cpus:限制2核CPU\

  1. 常用运维命令
    查看实时日志
    docker logs -f ssr-container

进入容器shell(调试用)
docker exec -it ssr-container sh

查看PM2管理的进程状态
docker exec ssr-container pm2 list

优雅停止容器
docker stop ssr-container

🔧 关键配置说明表
配置项 作用 典型值
pm2-runtime 容器优化的PM2运行模式 必用
instances: 'max' 最大化利用CPU核心 适合SSR高并发
exec_mode: 'cluster' 启用集群模式 需配合instances
autorestart: true 异常退出自动恢复 生产环境必备
NODE_ENV: production 启用生产模式 优化性能
max_memory_restart 防止内存泄漏 建议1G\

💡 最佳实践建议
安全加固
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
↑ 避免以root运行

健康检查
HEALTHCHECK --interval=30s --timeout=3s
CMD curl -f http://localhost:3000/health || exit 1 多环境配置 // ecosystem.config.js env_development: { NODE_ENV: 'development' }

镜像优化
RUN npm cache clean --force
↑ 构建完成后清理缓存

通过以上配置,你将获得:
生产级SSR服务的Docker化部署
PM2提供的进程守护和集群支持
优化的容器资源管理
完善的日志和监控能力