Add BP about bootstraping using node instead of npm

This commit is contained in:
Kevyn Bruyere
2020-07-22 11:38:17 +02:00
parent 589b8c9979
commit 54e206cde0
2 changed files with 66 additions and 3 deletions

View File

@ -1094,11 +1094,12 @@ Bear in mind that with the introduction of the new V8 engine alongside the new E
## ![✔] 8.2. Bootstrap the code using 'node' command, avoid 'npm run' scripts
**TL;DR:**
**TL;DR:** use `CMD ['node','server.js']` to start your app. This prevents problems with child-process, signal handling and avoid creating unnecessary processes.
**Otherwise:**
🔗 [**Read More: Clean npm cache**](/sections/docker/file.md)
**Otherwise:** You'll have hard shutdowns, possibly losing current requests and/or data
[**Read More: Bootstrap container using node command, avoid npm start**](/sections/docker/bootstrap-using-node.md)
<br /><br /><br />

View File

@ -0,0 +1,62 @@
# Bootstrap container using node command instead of npm
## One paragraph explainer
We are used to see code examples where folks start their app using `CMD 'npm start'`. This is a bad practice. The `npm` binary will not forward signals to your app which prevents graceful shutdown (see #716). If you are using Child-processes they wont be cleaned up correctly in case of unexpected shutdown, leaving zombie processes on your host. `npm start` also results in having an extra process for no benefit. To start you app use `CMD ['node','server.js']`.
### Code example
```dockerfile
FROM node:12-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci --production && npm clean cache --force
CMD ['node', 'server.js']
```
### Antipatterns
Using npm start
```dockerfile
FROM node:12-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci --production && npm clean cache --force
# dont do that!
CMD “npm start”
```
Using node in a single string will start a bash/ash shell process to execute your command. That is almost the same as using `npm`
```dockerfile
FROM node:12-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci --production && npm clean cache --force
# dont do that, it will start bash
CMD "node server.js"
```
Starting with npm, heres the process tree:
```
$ ps falx
UID PID PPID COMMAND
0 1 0 npm
0 16 1 sh -c node server.js
0 17 16 \_ node server.js
```
There is no advantage to those two extra process.
Sources:
https://maximorlov.com/process-signals-inside-docker-containers/
https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#handling-kernel-signals