Je vous partage aujourd'hui mon Dockerfile permettant de générer le runtime d'un serveur en NodeJS avec express.

L'avantage de la méthode par rapport à du « classique » est que vous pouvez très simplement livrer des builds sur différents environnement et optimiser la taille du conteneur pour être le plus léger possible.

Un build en deux temps

Dans un premier temps, nous installons les dépendances de dev et nous compilerons le code typescript vers un bundle JS.

Dans un second temps, on récupère ce code compilé et désormais nous pouvons nous passer de certaines dépendances. On installe donc que les dépendances requises pour la production.

Tout ceci est possible grâce aux builds multi-stage de Docker.

Pour l'exemple suivant j'utilise le gestionnaire de paquets yarn à la place de npm.

###
### Première partie : Compilation du code Typescript
###
FROM node:10.15-jessie-slim as tsc-builder
WORKDIR /usr/src/app

# Installation des dépendances et build.
COPY . .
RUN yarn install && yarn run build

###
### Construction de l'image de production (2ème partie)
###
FROM node:10.15-jessie-slim as runtime-container
WORKDIR /usr/src/app

# On copie les sources compilées depuis la première étape
COPY --from=tsc-builder /usr/src/app/build ./build
COPY --from=tsc-builder /usr/src/app/locales ./locales
COPY --from=tsc-builder ["/usr/src/app/package.json", "/usr/src/app/yarn.lock", "./"]

# Installation des modules de production seulement
RUN yarn install --prod

# On expose le port 4000 en sortie
EXPOSE 4000

# La commande de lancement
CMD [ "node", "./build/main.js" ]

Et le .dockerignore associé.

node_modules
npm-debug.log
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
.env
*/bin
*/obj
README.md
LICENSE
.vscode

Si vous avez des questions, n'hésite pas à laisser un commentaire.