NestJS:复制资源在 Linux 上不起作用

Mat*_*ndt 5 node.js docker dockerfile nestjs nestjs-config

我正在开发一个 NestJS 项目,复制我的资源在我的 Mac 上工作得很好。但是,一旦我将其docker化,它就无法工作。

嵌套-cli.json

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "assets": [
      "**/*.hbs",
      "**/*.css",
      "**/*.jpg",
      "**/*.png",
      "**/*.jpeg"
    ],
    "watchAssets": true
  }
}
Run Code Online (Sandbox Code Playgroud)

Dockerfile:

FROM mhart/alpine-node:latest

RUN npm install pm2 -g

COPY backend /var/www/backend
COPY process.json /var/www
WORKDIR /var/www

#RUN npm i -g @nestjs/cli (tried with and w/out -> no difference)
RUN cd ./backend && npm i --legacy-peer-deps && npm run build

# Expose ports
EXPOSE 80

CMD ["pm2-runtime", "./backend/main"]
Run Code Online (Sandbox Code Playgroud)

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true
  }
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.build.json

npm{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}
Run Code Online (Sandbox Code Playgroud)

我没有收到任何构建错误,并且我已在我的 Mac 上手动重现了这些步骤,并且所有内容都被复制。当我进入 docker 映像并手动运行 buld 步骤时,它可以正常工作,没有错误,但同样,没有复制任何资产。

我的资产位于不同的模块和服务文件夹中,并且希望保持这种方式 - 所以我不是在寻找简单的构建后复制目录解决方案:)

我尝试过不同的Linux发行版。和节点版本 - 我不知道还要检查什么

小智 1

我在尝试在 Linux 主机上对我的项目进行 dockerize 时遇到了类似的问题(yarn build在本地工作得很好,但资产没有复制到 docker 映像中)。

原始设置

Dockerfile:

FROM node:16-bullseye AS builder
WORKDIR /usr/app
COPY package.json ./
COPY yarn.lock ./
COPY src ./
COPY nest-cli.json ./
COPY tsconfig.build.json ./
COPY tsconfig.json ./
RUN yarn install
RUN yarn build
...
Run Code Online (Sandbox Code Playgroud)

嵌套-cli.json:

{
  ...,
  "compilerOptions": {
    "assets: [ "modules/mails/templates/**/*.hbs" ],
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

使固定

“compilerOptions.assets”中指定的路径始终相对于项目中的“src”文件夹。检查我的 docker 映像,我意识到“src”文件夹的内容被复制到 docker 内的 build 文件夹的根目录中。

当“src”的内容移动到根目录时,NestJS 能够成功构建项目,但由于在“src”文件夹中查找资产,因此不会复制任何文件。在我的 Dockerfile 中更改此内容解决了问题:

COPY src ./src # Instead of 'COPY src ./'
Run Code Online (Sandbox Code Playgroud)