我正在尝试为我的 Node.js 和 Nest.js 应用程序设置多阶段 Docker 构建。 Dockerfile 包括安装依赖项、构建应用程序和运行它。但是,我在 Dockerfile 的生产阶段遇到了
npm run build
命令的问题。
这是我的 Dockerfile 的简化版本:
# Use node base image with tag 18-slim
FROM node:18-slim as base
# Set NODE_ENV environment variable to production
ENV NODE_ENV=production
# Expose port 3000
EXPOSE 3000
# Create app directory and set permissions
WORKDIR /app
RUN chown -R node:node /app
# Switch to non-root user
USER node
# Copy package.json and package-lock.json
COPY --chown=node:node package*.json ./
# Install dependencies
RUN npm install && npm cache clean --force
# Copy source code
COPY --chown=node:node . .
# Development stage
FROM base as dev
# Set working directory
WORKDIR /app
# Copy source code from base stage
COPY --from=base /app .
# Set PATH environment variable in dev stage
ENV PATH /dev/node_modules/.bin:$PATH
# Set NODE_ENV environment variable to development
ENV NODE_ENV=development
# Command to run development server
CMD ["npm", "run", "start:dev"]
# Production stage
FROM base as prod
# Set working directory
WORKDIR /app
# Copy source code from base stage
COPY --from=base /app .
# Set PATH environment variable in dev stage
ENV PATH /dev/node_modules/.bin:$PATH
# Build production code
RUN npm run build
# Command to run production server
CMD ["node", "dist/main.js"]
我收到的错误消息是:
sh: 1: nest: not found
Nest.js CLI 在生产构建期间似乎在 PATH 中不可用,即使它作为开发依赖项安装在我的 package.json 中。
如何确保 Nest.js CLI 在 Dockerfile 的生产构建过程中在 PATH 中可用?
查看将
/dev/node_modules/.bin
更改为 /app/node_modules/.bin
是否可以解决问题。
在
base
阶段,指令WORKDIR /app
设置以下指令的工作目录,例如要在RUN
执行的/app
,以便以下
指令 RUN npm install
创建 /app/node_modules
。
但后来,在
dev
和prod
阶段,指令ENV PATH
包含路径/dev/node_modules/.bin
,这与base
阶段的设置相矛盾。