Docker image
Nous voulons construire notre API, supprimer toutes les dépendances utilisées uniquement pour le développement et compiler le tout dans une image Docker qui peut être déployée localement ou dans le nuage en tant que conteneur.
Transpiler TS vers JS
Tout d'abord, vous remarquerez que nous pouvons compiler notre projet Typescript existant en Javascript pur :
tscVous noterez la sortie créée dans build.
Vous pouvez essayer d'exécuter votre serveur comme n'importe quelle autre application node :
node build/server.jsMais cela provoquera une erreur concernant nos alias de chemin comme @controller ou @orm. Nous devons les résoudre dans le cadre de notre construction :
npm install --save-dev tsc-alias
npm install -g tsc-aliasPost-traiter les fichiers construits à l'aide de :
tsc-alias -p tsconfig.jsonEt redémarrez le serveur :
node build/server.jsVotre serveur devrait fonctionner normalement. Essayez http://localhost:5050/info pour tester.
Nous aurons aussi besoin de copier tous les fichiers statiques dans le répertoire build/public (comme notre swagger.json généré).
Combinons toutes nos étapes de construction en un seul script npm dans package.json.
Tout d'abord, nous avons besoin d'outils pour nettoyer l'ancien répertoire de construction et copier les fichiers :
Nous pouvons maintenant créer un script pour construire notre API (package.json) :
Nous pouvons maintenant construire notre projet entier avec :
Dockerfile
Nous voulons maintenant créer une image Docker qui inclut Node 20, notre répertoire de construction et seulement les dépendances nécessaires à l'exécution de notre projet (à l'exception des outils de développement). L'idée est de créer la plus petite image Docker possible pour faire fonctionner notre projet.
Créons un fichier Docker dans config/docker/Dockerfile.prod :
Notez qu'il s'agit d'une construction en deux phases. Nous créons d'abord un conteneur dans lequel nous allons construire notre projet. Ensuite, nous créons une seconde image propre, en copiant seulement le contenu du répertoire build dans le premier conteneur. Nous installons aussi seulement les paquets de production de nos dépendances avec npm install --omit=dev. Enfin, nous démarrons notre serveur avec le script npm run start-api. C'est un script que nous n'avons pas encore ajouté à notre package.json :
Enfin, ajoutez le fichier .dockerignore à la racine de votre projet pour ignorer tous les fichiers que vous ne voulez pas dans vos images :
Dans un terminal hors de votre DevContainer, naviguez jusqu'à la racine de votre projet et exécutez ce qui suit :
Nous donnons à l'image une balise api pour pouvoir y faire référence plus tard.
Cela permettra de construire une image multiplateforme ! Vérifiez que votre image existe dans votre dépôt Docker local :
Vous pouvez également vérifier le contenu de l'image :
Vous verrez le contenu de votre image ! Tapez exit pour quitter le conteneur.
Pour exécuter votre image en tant que conteneur local (assurez-vous que le serveur est arrêté dans votre DevContainer !) :
Essayez de consulter le lien http://localhost:5050/info
Vous devriez obtenir vos informations, mais la base de données n'est pas connectée. C'est normal, cette image n'a pas accès à notre base de données déployée avec notre Dev Container !
Compose
Localement, ou sur un serveur distant, nous pouvons vouloir configurer l'ensemble de notre système en utilisant Docker Compose. Le fichier de configuration ressemblerait à ce qui suit :
Notez l'utilisation de variables d'environnement, que notre code mentionne en utilisant process.env.. Nous remplaçons effectivement nos variables par d'autres pour l'utilisation en production ! **N'utilisez jamais en production les mêmes secrets qu'en développement !
Vous pouvez démarrer votre environnement en utilisant :
Vérifiez vos nouveaux services :
Obtenez l'ID du service mariadb.
Initialisez votre base de données avec :
Essayez de consulter le lien http://localhost:5050/info, vous devriez constater que la base de données est maintenant connectée !
Pour arrêter tous vos services :
Mis à jour