40 lines
1.3 KiB
Docker
40 lines
1.3 KiB
Docker
# ---- Stage 1: Build ----
|
||
# 选择一个包含 Node.js 的官方镜像。使用 LTS (长期支持) 版本以保证稳定性。
|
||
# slim 版本体积更小,适合生产环境。
|
||
FROM node:18-slim AS builder
|
||
|
||
# 在容器内创建一个工作目录
|
||
WORKDIR /usr/src/app
|
||
|
||
# 复制 package.json 和 package-lock.json 到工作目录
|
||
# 这样可以利用 Docker 的层缓存机制,只有当这两个文件变化时才会重新安装依赖
|
||
COPY package*.json ./
|
||
|
||
# 安装项目依赖
|
||
# 使用 --only=production 参数可以避免安装 devDependencies,减小最终镜像体积
|
||
RUN npm install --only=production
|
||
|
||
# 复制所有项目文件到工作目录
|
||
COPY . .
|
||
|
||
# ---- Stage 2: Production ----
|
||
# 使用一个更轻量的基础镜像来运行应用
|
||
FROM node:18-slim
|
||
|
||
# 设置容器内的工作目录
|
||
WORKDIR /usr/src/app
|
||
|
||
# 从 builder 阶段复制已经安装好的 node_modules
|
||
COPY --from=builder /usr/src/app/node_modules ./node_modules
|
||
|
||
# 复制应用程序代码
|
||
COPY --from=builder /usr/src/app .
|
||
|
||
# 暴露应用程序运行的端口
|
||
# 这个端口号应该与您 server.js 中监听的端口一致,后续会通过环境变量传入
|
||
EXPOSE 8101
|
||
|
||
# 定义容器启动时执行的命令
|
||
# 使用 ["node", "server.js"] 而不是 "node server.js",这是更推荐的 exec 格式
|
||
CMD ["node", "server.js"]
|