मैंने हाल ही में कम रैम वाले वातावरण में अपर्याप्त मेमोरी के कारण डॉकर में टाइपस्क्रिप्ट बिल्ड को विफल होते देखा है, लेकिन डॉकर बिल्ड जारी है नोड आउट-ऑफ-मेमोरी त्रुटि 5/6 पर और आखिरी तक चरण, केवल तब बाहर निकलता है जब नोड निष्पादन (6/6) संकलित फाइलों की कमी के कारण विफल हो जाता है। कई मेमोरी-सीमित वातावरण के कारण प्रजनन जटिल है - फ़ाइलों के लिए अंत में इसे पुन: प्रस्तुत करें देखें।

$ docker build .
Sending build context to Docker daemon  55.17MB
Step 1/6 : FROM node:14.14-alpine3.12
 ---> b21353984bd1
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> fe13e46eb756
Step 3/6 : COPY . ./
 ---> f14ece6934d0
Step 4/6 : RUN npm install
 ---> Running in 558126753ba5
npm WARN my_container@ No repository field.
npm WARN my_container@ No license field.

added 2 packages from 44 contributors and audited 16 packages in 2.476s
found 0 vulnerabilities

Removing intermediate container 558126753ba5
 ---> 188ed518072e
Step 5/6 : RUN npm run build
 ---> Running in ecd6da9c1565

> my_container@ build /app
> tsc index.ts


<--- Last few GCs --->

[16:0x55696cd7c300]    21705 ms: Mark-sweep (reduce) 491.3 (494.4) -> 490.6 (495.4) MB, 738.9 / 0.0 ms  (+ 0.1 ms in 16 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 797 ms) (average mu = 0.129, current mu = 0.073) all[16:0x55696cd7c300]    22864 ms: Mark-sweep (reduce) 491.7 (494.4) -> 490.9 (495.6) MB, 1063.0 / 0.0 ms  (+ 0.1 ms in 16 steps since start of marking, biggest step 0.0 ms, walltime since start of marking 1159 ms) (average mu = 0.102, current mu = 0.083) a

<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
Removing intermediate container ecd6da9c1565
 ---> 51bc50e86758
Step 6/6 : RUN npm start
 ---> Running in cdaed5cbb63e

> my_container@ start /app
> node index.js

internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module '/app/index.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! my_container@ start: `node index.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the my_container@ start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-10-22T21_20_00_360Z-debug.log
The command '/bin/sh -c npm start' returned a non-zero code: 1

समान प्रश्न के आधार पर, ऐसा लगता है कि समस्या यह है कि डॉकर नहीं है आउट-ऑफ़-मेमोरी त्रुटि से एक गैर-शून्य निकास कोड प्राप्त करना। वास्तव में, मैं बिल्ड स्क्रिप्ट में tsc index.ts को tsc index.ts && exit 0 में बदल सकता हूं और एनपीएम बिल्ड स्क्रिप्ट को एक नए त्रुटि कोड के साथ छोड़ने का कारण बन सकता हूं जो डॉकर को समाप्त करता है:

Step 5/6 : RUN npm run build
 ---> Running in b4f49b1eb460

> my_container@ build /app
> tsc index.ts && exit 0


<--- Last few GCs --->

[17:0x559d4266b300]    21406 ms: Mark-sweep (reduce) 490.7 (493.6) -> 490.0 (494.9) MB, 733.1 / 0.0 ms  (average mu = 0.173, current mu = 0.065) allocation failure scavenge might not succeed
[17:0x559d4266b300]    22322 ms: Mark-sweep (reduce) 491.1 (493.9) -> 490.4 (495.4) MB, 721.2 / 0.0 ms  (+ 40.0 ms in 9 steps since start of marking, biggest step 17.1 ms, walltime since start of marking 898 ms) (average mu = 0.171, current mu = 0.169) al

<--- JS stacktrace --->

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
Aborted (core dumped)
npm ERR! code ELIFECYCLE
npm ERR! errno 134
npm ERR! my_container@ build: `tsc index.ts && exit 0`
npm ERR! Exit status 134
npm ERR! 
npm ERR! Failed at the my_container@ build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-10-22T21_33_57_785Z-debug.log
The command '/bin/sh -c npm run build' returned a non-zero code: 134

मैंने सोचा था कि एनपीएम लिपियों को अंतिम कमांड के आउटपुट को वापस करना चाहिए, और यह तब तक होता है जब तक node कमांड के बाद एक && होता है जो स्पष्ट रूप से इस तरह से त्रुटि प्राप्त करता है कि npm धावक नहीं करता है। क्या कोई समझा सकता है नोड आउट-ऑफ-मेमोरी त्रुटि डॉकर को रिले क्यों नहीं की जाती है, चाहे टाइपस्क्रिप्ट आउट-ऑफ-मेमोरी की एक विचित्रता या मेरे प्रारंभिक कॉन्फ़िगरेशन में कोई दोष हो?

इसे पुन: उत्पन्न करें

आप इसे केवल ~500MB मुक्त RAM वाले वातावरण में (यदि पर्याप्त अन्य प्रक्रियाएं चल रही हों तो 1GB में संभव है) निम्न चार फ़ाइलों के साथ पुन: पेश कर सकते हैं, एक स्वातिनेम द्वारा टाइपस्क्रिप्ट मेमोरी उपयोग के अनुकूलन पर पोस्ट:

Package.json: (tsc index.ts && exit 0 का प्रभाव देखने के लिए बिल्ड स्क्रिप्ट बदलें)

{
  "name": "my_container",
  "description": "My Container",
  "scripts": {
    "build": "tsc index.ts",
    "start": "node index.js"
  },
  "dependencies": {
    "@types/node": "^13.1.8",
    "aws-sdk": "^2.777.0",
    "typescript": "~3.8.3"
  }
}

Index.ts:

export * from "aws-sdk";

Tsconfig.json:

{
  "compilerOptions": {
    "diagnostics": true,
    "noEmitOnError": true,

    "strict": true,

    "target": "ES2020",
    "lib": ["ESNext"],
    "moduleResolution": "Node",
    "module": "ESNext"
  }
}

डॉकरफाइल:

FROM node:14.14-alpine3.12
WORKDIR /app
COPY . ./
RUN npm install
RUN npm run build
RUN npm start

(प्रारंभ करने के लिए docker build . चलाएं)

2
MBer 23 अक्टूबर 2020, 00:38
1
Nest.js एप्लिकेशन बनाते समय मुझे ठीक उसी समस्या का सामना करना पड़ा और मेरे Dockerfile में निम्न बिल्ड कमांड का उपयोग करके समाप्त हुआ: RUN npm run build && echo true। ऐसा लगता है कि && शेल ऑपरेटर त्रुटि कोड का सही ढंग से पता लगाता है और इसे सही तरीके से डॉकर में प्रचारित करता है। अभी भी नहीं पता कि इस अजीब व्यवहार का कारण क्या है।
 – 
Oleksandr Kovpashko
19 मई 2021, 18:07
यह भी अच्छा है, Dockerfile के संदर्भ में बाहर निकलने से बेहतर है।
 – 
MBer
20 मई 2021, 02:12

1 उत्तर

सबसे बढ़िया उत्तर

जबकि मैं अभी भी कारण को समझना पसंद करूंगा, निम्नलिखित वर्कअराउंड बिल्ड स्क्रिप्ट में अच्छा प्रदर्शन कर रहा है:

{
  // other settings...
  "scripts": {
    "build": "tsc && exit 0"
  }
}

किसी भी तरह, एक एकल tsc कमांड का सीधा प्रतिक्रिया कोड बाहरी स्क्रिप्ट तक नहीं पहुंचता है, लेकिन सशर्त && के विफल होने का परिणाम होता है।

2
MBer 11 मई 2021, 00:59