NestJS Docker 错误:找不到模块 @nestjs/cli/bin/nest.js

Docker

排查 NestJS 微服务中的 Docker 问题

在开发一个 基于微服务的 RestAPI,在 Docker 容器中运行服务有时会导致意外问题。当 Docker 无法找到 模块,阻止服务运行。

当您已经设置了多个服务(例如身份验证和预订)并正在努力确保它们在各自的容器中顺利运行时,这个问题尤其令人沮丧。遇到一个 错误可能会阻碍开发并需要立即排除故障。

该问题通常与 Docker 容器内如何处理依赖关系有关,尤其是在使用 基础镜像和包管理器,例如 。错误日志通常指向容器中缺少的模块 目录,影响服务启动过程。

在本指南中,我们将逐步介绍此错误的常见原因,讨论潜在的解决方案,并提供解决该错误的建议,确保您的 NestJS 服务在 Docker 环境中按预期运行。

命令 使用示例
@nestjs/cli 此命令全局安装 NestJS CLI,这对于在 Docker 中运行 NestJS 应用程序至关重要。它有助于避免 错误。
RUN npm install -g pnpm 在 Docker 容器中全局安装 pnpm 包管理器,这可确保正确安装所有依赖项,尤其是 pnpm 范围内的依赖项。
pnpm run build 使用 pnpm 执行指定服务(身份验证或预订)的构建命令,确保为开发和生产环境正确构建应用程序。
COPY --from=development /usr/src/app/dist 此 Docker 多阶段构建命令将构建输出从开发阶段复制到生产阶段,优化 Docker 映像大小并确保应用程序准备好运行。
CMD ["node", "dist/apps/auth/main.js"] 该命令用于运行 通过直接从构建的 dist 目录执行主 JavaScript 文件来在生产环境中提供服务。
testEnvironment: 'node' 在Jest配置中,该命令将测试环境设置为Node.js,确保单元测试能够准确模拟后端环境。
describe('Nest CLI Module Check') 在 Jest 中,此函数定义了一个测试套件,用于检查是否 在 Docker 容器中正确安装,确保模块依赖关系得到解决。
exec('nest --version') 在测试中执行 shell 命令以验证 Docker 容器中提供 CLI,有助于检测模块是否丢失或配置错误。

了解 Docker 和 NestJS CLI 集成

示例中提供的第一个 Dockerfile 重点解决 运行类似服务时与 NestJS CLI 相关的错误 和 。这是通过确保在开发和生产阶段安装必要的全局依赖项来实现的。 Dockerfile 首先使用轻量级 节点:高山 图像,这有助于减小整体图像大小。然后它会安装包管理器 和 NestJS CLI 全局,以确保所有必需的模块在环境中可用。

一旦安装了 CLI 和包管理器,该脚本就会复制必要的文件,例如 和配置文件,这对于安装项目依赖项至关重要。安装依赖项后,使用命令构建项目 ,它将源代码编译成可分发的格式。此步骤是必要的,因为编译的输出将在最终的生产环境中使用,避免开发工具不必要的开销。

Dockerfile 的第二阶段使用多阶段构建过程。在此阶段,开发阶段的编译输出将被复制到新的生产环境,确保最终映像是轻量级的并针对性能进行了优化。此方法有助于保持生产映像小且安全,因为它仅包含运行应用程序所需的内容。通过这样做,系统可以防止与生产环境中包含的开发依赖项相关的潜在冲突或问题。

为了处理应用程序启动, 指令指定要执行的主文件,通常位于 构建过程后的目录。 Docker容器运行命令 (或者 预订/main.js 对于其他服务),确保微服务在正确的环境中执行。这种方法允许微服务架构进行扩展,因为每个服务都可以隔离在自己的容器中,并正确管理所有依赖项。整体设置确保 Docker 高效运行 NestJS 服务,解决容器化过程中遇到的常见 CLI 问题。

使用节点和 Docker 优化解决 NestJS Docker Module Not Found 错误

该解决方案使用带有 Docker 的 Node.js 环境来解决缺少 @nestjs/cli/bin/nest.js 的问题。

// Dockerfile - Solution 1 (Ensure Global Dependencies are Installed)FROM node:alpine AS development
WORKDIR /usr/src/app
COPY package.json pnpm-lock.yaml tsconfig.json nest-cli.json ./
RUN npm install -g pnpm @nestjs/cli  # Install NestJS CLI globally
RUN pnpm install
COPY . .
RUN pnpm run build auth
FROM node:alpine AS production
WORKDIR /usr/src/app
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/apps/auth/main.js"]

通过依赖管理修复 NestJS Docker 设置中缺少的模块

这种方法的重点是更有效地处理依赖关系,确保所需的模块始终存在。

// Dockerfile - Solution 2 (Install CLI during both development and production stages)FROM node:alpine AS development
WORKDIR /usr/src/app
COPY package.json pnpm-lock.yaml tsconfig.json nest-cli.json ./
RUN npm install -g pnpm @nestjs/cli  # Install CLI in dev environment
RUN pnpm install
COPY . .
RUN pnpm run build reservations
FROM node:alpine AS production
WORKDIR /usr/src/app
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm @nestjs/cli --prod  # Install CLI in production too
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/apps/reservations/main.js"]

验证 Docker 容器中模块安装是否正确的自动化测试

此脚本使用 Jest 添加单元测试,以验证所需的模块是否已正确安装在不同的环境中。

// jest.config.js - Unit Testsmodule.exports = {
  testEnvironment: 'node',
  moduleFileExtensions: ['js', 'json', 'ts'],
  rootDir: './',
  testRegex: '.spec.ts$',
  transform: { '^.+\\.(t|j)s$': 'ts-jest' },
  coverageDirectory: './coverage',
};

// sample.spec.ts - Check if Nest CLI is available in the Docker containerdescribe('Nest CLI Module Check', () => {
  it('should have @nestjs/cli installed', async () => {
    const { exec } = require('child_process');
    exec('nest --version', (error, stdout, stderr) => {
      expect(stdout).toContain('Nest');  // Verify CLI presence
    });
  });
});

处理 Docker 化的 NestJS 服务中的节点模块

在 NestJS 中使用微服务架构时,一个关键方面是确保您的依赖项在 Docker 容器中正确安装和管理。 Docker 化环境有时会使处理变得复杂 ,特别是在使用多阶段构建时,这可能会导致类似的错误 。当全局模块(例如 未正确安装在容器内。

为了避免这种情况,重要的是以确保所有必要的模块都存在于开发和生产阶段的方式构建 Dockerfile。一种常见的解决方案是显式安装 在这两个阶段中,以避免运行以下命令时与丢失二进制文件相关的任何问题 或者 。无论您使用的是 pnpm、npm 还是yarn,此方法都可以提供跨环境的一致性。

此外,使用诸如 可以优化Docker镜像大小和依赖安装过程。但是,您还必须确保全局安装 pnpm,因为许多开发人员在 Docker 容器内的不同包管理器之间切换时面临问题。构建多阶段构建,以便只有必要的文件(例如 dist 文件夹和 )复制到生产阶段可以帮助简化部署过程并避免与丢失模块相关的常见错误。

  1. 如何防止 Docker 中丢失模块的错误?
  2. 确保您安装 全球使用 在开发和生产阶段。
  3. 为什么我收到“找不到模块@nestjs/cli/bin/nest.js”错误?
  4. 此错误通常发生在 未全局安装在您的 Docker 容器中。添加 应该解决这个问题。
  5. 我应该在 Docker 容器中使用 npm 还是 pnpm?
  6. 在磁盘空间方面可以更有效,但请确保它全局安装在容器中 以避免依赖性问题。
  7. 我可以在一个 Docker 容器中运行多个服务吗?
  8. 虽然技术上可行,但最好运行每个 微服务位于其自己的 Docker 容器中,以实现更好的隔离和可扩展性。
  9. 如何减小 Docker 映像的大小?
  10. 使用多阶段构建,其中仅包含必要的文件,例如 和 被复制到最终的生产图像。

在 Docker 化的 NestJS 微服务环境中管理依赖关系可能具有挑战性,尤其是当像这样的全局模块时 都参与其中。在开发和生产阶段安装这些模块至关重要。

通过正确的多阶段 Dockerfile 设置,我们可以避免丢失模块错误并优化生产容器。这确保了服务的顺利运行,例如 和 没有依赖冲突。

  1. 本文是根据 Docker 文档和社区论坛的见解生成的。欲了解更多信息,请访问 Docker 官方网站 Docker 文档
  2. 有关处理 NestJS CLI 和微服务模式的指南可以在官方 NestJS 文档中找到 NestJS 文档
  3. 有关解决模块问题的更多详细信息改编自 StackOverflow 上的讨论 堆栈溢出