Framework Backend Typescript
NestJS est un framework Typescript dont la philosophie emprunte beaucoup à Angular.
Cela lui permet de proposer une architecture plus modulaire et de produire
des projets plus maintenables, extensibles et robustes qu’avec
un développement NodeJS
lambda.
Par rapport à Angular, il est complètement agnostique concernant le front,
il est tout à fait possible d’utiliser NestJS
pour bâtir une API,
un front en React
ou même une application CLI.
Si vous ajoutez à cela de très bonnes performances et une popularité grandissante, vous ne pouvez faire qu’un très bon choix en adoptant NestJs… :)
NestJS et Docker
On part du Hello World
qu’on installe de la façon suivante :
npm i -g @nestjs/cli
nest new app
On ajoute ensuite le Dockerfile
suivant :
FROM node:12-alpine
WORKDIR /app
COPY ./app .
RUN yarn; \
yarn build
CMD ["yarn", "start:prod"]
Et le fichier .dockerignore
suivant :
/app/node_modules
/app/dist
Cela permet d’éviter de mettre ces gros dossiers dans le contexte Docker et de les copier dans l’image.
Un problème de poids
L’image se contruit et se lance correctement :
docker build . -t nestjs
docker run --rm -it -p 3000:3000 nestjs
Par contre, l’image pèse 400 Mo
!!! Pour un simple Hello World
?
L’explication
L’image contient toutes les devDepencies
et avec Typescript
,
elles pèsent lourd (les @types, le compilateur …)
La solution consiste à construire l’image Docker en 2 étapes :
- la première pour compiler le
Typescript
. - la seconde pour installer les dépendences de production et servir le build.
On utilise pour cela le mécanisme du multistage build de Docker.
FROM node:12-alpine AS builder
WORKDIR /app
RUN npm install -g @nestjs/cli
COPY ./app /app
RUN yarn; \
yarn build
FROM node:12-alpine
ENV NODE_ENV production
WORKDIR /app
COPY /app/package.json .
COPY /app/yarn.lock .
COPY /app/dist ./dist
RUN yarn
CMD ["yarn", "start:prod"]
L’image finale ne contient donc que le dist
et les dépendances de production.
Le résultat : une image de … 264 Mo
!! Mieux, mais encore très décevant …
Supprimer le cache
Voici les tailles de chaque élément de l’image Docker :
- l’image de base
node:12-alpine
: 85Mo - le répertoire
node_modules
: 35Mo - le répertoire
dist
: < 1Mo
Le reste ? En fait, il s’agit du
cache de yarn
qui peut être supprimé dans la dernière commande RUN
du Dockerfile
.
RUN yarn; \
yarn cache clean
CMD ["yarn", "start:prod"]
Enfin, nous obtenons une image d’une taille raisonnable : 100Mo
tout rond.
Voilà vous pouvez maintenant utiliser NestJS
dans vos micro-services hébergés
sur Kubernetes !