簡體   English   中英

docker 在 Nestjs 微服務構建上構建失敗

[英]docker build fail on nestjs microservice build

我有這個 docker 文件:

FROM node:14.15.0 as build

WORKDIR /node-app

COPY package*.json /node-app/
RUN npm set progress=false && npm config set depth 0 && npm cache clean --force
RUN npm install
COPY . .
RUN npm run build

FROM node:14.15 

WORKDIR /node-app
COPY package.json /node-app/

RUN npm install --only=production
COPY --from=build /node-app/dist ./dist  
RUN npm run start:prod 

使用這個 package.json

{
  "name": "genysis-dbservice",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "license": "UNLICENSED",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "private": true,
  "dependencies": {
    "@nestjs/common": "^7.6.5",
    "@nestjs/config": "^0.6.1",
    "@nestjs/core": "^7.6.5",
    "@nestjs/microservices": "^7.6.5",
    "@nestjs/platform-express": "^7.6.5",
    "@nestjs/websockets": "^7.6.5",
    "core-js": "^3.6.5",
    "neo4j-driver": "^4.1.1",
    "reflect-metadata": "^0.1.12",
    "rimraf": "^2.6.2",
    "rxjs": "^6.3.3"
  },
  "devDependencies": {
    "@nestjs/testing": "^7.4.2",
    "@types/express": "^4.16.0",
    "@types/jest": "^26.0.9",
    "@types/node": "^10.12.18",
    "@types/supertest": "^2.0.7",
    "concurrently": "^4.1.0",
    "jest": "^26.3.0",
    "nodemon": "^1.18.9",
    "prettier": "^1.15.3",
    "supertest": "^3.4.1",
    "ts-jest": "^26.2.0",
    "ts-node": "8.1.0",
    "tsconfig-paths": "3.8.0",
    "tslint": "5.16.0",
    "typescript": "~4.0.5",
    "wait-on": "^3.2.0"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".spec.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

這個tsconfig:

  "compilerOptions": {
      "module": "commonjs",
      "declaration": true,
      "removeComments": true,
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "allowSyntheticDefaultImports": true,
      "target": "es2019",
      "sourceMap": true,
      "outDir": "./dist",
      "baseUrl": "./",
      "incremental": true
  },
  "exclude": ["node_modules"]
}

我的節點是 14.15.0 版本,我的 npm 是 6.14.8,全局嵌套是 7.5.4。 我已將 typescript 版本從 ~4.5.0 更改為 4.4.2 再到 4.0.5,但在運行 npm 運行構建時仍然出現故障。

 #16 2.145 sh: 1: nest: not found

不用說 npm 運行構建並運行啟動:產品在 docker 之外工作正常.....

不用說 npm 運行構建並運行啟動:產品在 docker 之外工作正常

這里有幾點需要注意:

  1. nestjs 未在您的package.json中定義,因此未安裝。 我假設您在主機上全局安裝了 nestjs(在 docker 之外)
  2. 即使 Nestjs 將在您的package.json中定義,npm 也不會將其安裝為全局 ZEFE90A8E604A7CFB603

您可以通過以下幾種方式解決它:

  1. 如果您將 nestjs 添加到您的package.json ,它將可用於您的項目。 如果您希望使用package.json並使軟件包在全球范圍內可用,則將/node-app/node_modules添加到您的路徑(在您的主機上或在 Z05B6053C41A2130AFD6FC3B158BDA4E 圖像上)
     RUN npm install ENV PATH="/node-app/node_modules:${PATH}"
  2. 在您的 docker 映像上全局安裝 nestjs
     RUN npm install -g nestjs
  3. 利用捆綁您的代碼及其依賴項的工具(例如esbuild )將您的所有依賴項捆綁到一個文件中。 然后您可以分發單個文件而無需安裝任何依賴項

問題是缺少@nestjs/cli來構建您的項目。 您可以通過 2 種方式解決問題,具體取決於您的項目的維護方式。

1-如果您使用自動化工具來獲取項目,請編輯您的dockerfile以使以下行中的“之一”出現在RUN npm run build之前。 第一個全局安裝,因此您可以在 shell 中將其用作免費命令,第二個只能在 npm 腳本中使用。 構建映像將被自動刪除,因此您在容器內使用哪個並不重要,但如果您在沒有容器的情況下共享,則會有所不同。

> RUN npm install -g @nestjs/cli@7.5
> RUN npm i -D @nestjs/cli@7.5

2-如果您擁有該項目,請使用npm i -D @nestjs/cli@7.5或編輯packages.json並在創建容器之前手動添加

"devDependencies": {
        "@nestjs/cli": "7.5",
        "@nestjs/testing": "^7.4.2",

從您的packages.json中使用的版本可以追溯到一年前, version 7.5似乎是合適的版本。 目前這將安裝version 7.5.7 如果您仍然有相同的設置,請使用nest --version查看要使用的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM