Utilisation de Docker avec nodejs avec des dépendances node-gyp

Je prévois d’utiliser Docker pour déployer une application node.js. L’application a plusieurs dépendances qui nécessitent node-gyp. Node-gyp construit ces modules (par exemple, canvas, lwip, qrcode) sur des bibliothèques compilées sur la plate-forme de livraison et, selon mon expérience, ces versions peuvent dépendre de la version et des bibliothèques installées. .

Donc, la construction de mon noeud Dockerfile FROM: version est-elle la bonne approche? Cela semble être l’approche présentée dans chaque tutoriel Docker / Node que j’ai trouvé jusqu’à présent. Mais si je construis à partir d’une image de nœud, que va-t-il se passer lorsque je déploie le conteneur? Comment puis-je m’assurer que l’hôte cible aura les bibliothèques nécessaires pour comstackr les modules node-gyp?

L’autre façon que je cherche est de construire le Dockerfile FROM ubuntu: version . Mais je pense que cela signifierait l’installation de nodeJS dans l’image Ubuntu et que tout serait beaucoup plus grand.

Y a-t-il d’autres façons de gérer cela?

Comment puis-je m’assurer que l’hôte cible aura les bibliothèques nécessaires pour comstackr les modules node-gyp?

L’hôte cible exécute également docker. Tant que les dépendances sont dans votre image, votre serveur les a également. C’est le point entier avec docker si vous me le demandez. S’il s’exécute localement, il s’exécute également sur le serveur.

J’irais avec node-alpine ( FROM node:8-alpine ) pour des fichiers encore plus petits. Je me suis débattu avec node-gyp avant de m’en occuper, mais maintenant je ne vois même pas comment j’ai pensé que c’était un problème. Tant que vous ajoutez des outils de construction, RUN apk add python make gcc g++ vous êtes prêt à aller (cela ajoute cependant de 100 à 200 Mo à la taille).

Aussi, si cela prend du temps (disons que vous vous retrouvez à reconstruire votre image avec –no-cache de temps en temps), cela peut être une bonne idée de le diviser en une image de base de votre propre image FROM my-base-image:latest contenant les éléments que vous modifiez plus souvent.

Il y a une certaine courbe d’apprentissage à coup sûr, mais je ne l’ai pas trouvée aussi raide. Au moins pas si vous avez touché Docker avant.

L’autre façon que je cherche est de construire le Dockerfile FROM ubuntu: version.

J’avais seulement utilisé CentOS avant de sauter sur docker et j’ai lancé CentOS sur mes serveurs. J’ai donc pensé que ce serait aussi une bonne idée d’exécuter CentOS-images, mais j’ai trouvé cela stupide. Il n’y a absolument aucun gain sauf si vous avez besoin de quelque chose de très spécifique au système d’exploitation. Maintenant, je n’utilise plus que l’alpinisme depuis peut-être une demi-année, et jusqu’à présent, la seule commande spécifique à un alpin que j’ai à apprendre est apk add/del .

Et vous savez probablement déjà, mais ne passez pas trop de temps à optimiser la taille du fichier Docker au début. (Vous pouvez réduire considérablement la taille des couches en combinant des commandes sur une seule ligne (ajout de packages, exécution de commandes, suppression de packages), mais cela annule l’utilisation du cache d’images de docker si vous apportez de petites modifications dans les grandes couches. cela jusqu’à ce que ça compte.