# ---- Base Node ---- FROM node:19-alpine AS base WORKDIR /app # Install pnpm RUN npm install -g pnpm # Copy package files and install dependencies COPY package*.json ./ RUN pnpm install # ---- Build ---- FROM base AS build COPY . . RUN npm run build # ---- Production ---- FROM node:19-alpine AS production WORKDIR /app # Copy over the node_modules, etc from the build stage COPY --from=build /app/node_modules ./node_modules COPY --from=build /app/.next ./.next COPY --from=build /app/public ./public COPY --from=build /app/package*.json ./ COPY --from=build /app/next.config.js ./next.config.js # Expose the port the app will run on EXPOSE 3000 # Start the application CMD ["npm", "start"]
- 基础阶段(Base Stage):
- 使用
node:19-alpine
作为基础镜像。Alpine Linux 是一个轻量级的 Linux 发行版,非常适合用于 Docker 容器。 - 设置工作目录为
/app
。 - 安装
pnpm
,这是一种包管理工具,类似于 npm,但更高效。 - 复制
package*.json
文件到工作目录,然后运行pnpm install
安装依赖。
- 使用
- 构建阶段(Build Stage):
- 从基础阶段开始构建。
- 复制所有源代码文件到工作目录。
- 运行
npm run build
命令构建应用。这可能包括编译源代码、压缩资源等步骤,具体取决于项目配置。
- 生产阶段(Production Stage):
- 再次使用
node:19-alpine
作为基础镜像。 - 设置工作目录为
/app
。 - 从构建阶段复制
node_modules
、.next
目录、public
目录和一些配置文件。这保证了生产环境中只包含构建和运行应用所需的文件和依赖。 - 暴露端口 3000,这是应用将要运行的端口。
- 使用
npm start
命令启动应用。
- 再次使用
对应的 docker-compose.yaml
version: '3.6' services: web: build: . ports: - "3000:3000"