Environnement de développement avec Docker
Sep 16, 2022Hello,
Utiliser une image Docker toute prête c'est facile
Développer dans un environnement Docker, c'est un peu plus chiant
Mais c'est super important pour utiliser toute la puissance de Docker quand on est dev
On va voir
- un petit rappel sur comment on dev d'habitude
- comment on aurait fait naïvement avec Docker
- comment on peut faire plus efficace
Mais avant laisse-moi te donner un exemple.
On utilise un app Node/Express toute simple qui fait juste un Hello World :
On utilise nodemon pour vérifier que lors de la modification d'un fichier, node se relance tout seul :
Donc je lance : npm run start:dev
Je fais quelques modifs dans mon hello world.
On est good. C'est automatiquement pris en compte.
Là, normalement, c'est ce que tu as habituellement (que ça soit en Node ou Python ou PHP ...)
Je fais mon dev, quand je save mon fichier, je peux tester tout de suite que mes modifs sont bien prises en compte et que ça fonctionne.
Avec Docker
Comme maintenant, je sais l'intêret d'utiliser Docker (cf article : https://www.imranesubstack.dev/blog/c-est-quoi-docker), je ne veux plus dév à la Old Fashion
Je veux ma propre image Docker, pour être prêt pour la prod et avoir de la "portabilité" de mon dev.
Je fais donc mon Dockerfile tel qu'il sera utilisé en prod :
Puis :
- docker build . -t helloworld
- docker run -p 3000:3000 -d helloworld
Mon app fonctionne bien.
Je modifie mon code. La modification n'apparait pas, bien entendu.
Obliger de stop, build et de run à nouveau le tout pour que ça soit pris en compte.
Et là, ça fonctionne, ma modif est up.
Et c'est là que c'est hyper chiant.
À chaque fois que tu dois faire une modif, tu dois stop/build/run.
On peut faire mieux.
docker-compose
La solution vient de docker-compose qui permet de surcharger ton Dockerfile sans le toucher :
Ici je demande de remplacer la commande que l'on a vue plus haut "npm start" par "npm run start:dev"
C'est la commande dont j'ai besoin (cf premier paragraphe) pour que mes modifs soient prises en compte automatiquement.
Et je lui dis de "monter" mon dossier courant dans "/usr/src/app" remplaçant le COPY du docker file
Monter un dossier comme ça permet à Docker de croire qu'il utilise un dossier dans le container alors qu'en fait il utilise mon dossier de développement
Ainsi, quand je modifie un fichier dans mon dossier, c'est modifié dans le container aussi.
Donc le "nodemon" détectera des modifications (comme au début de l'article) et prendra en compte mes modifs.
Pour tester : docker-compose up --build
Wrap Up
Au final, créer une image Docker te permet de garantir que ton environnement de Dev est à l'identique de ton environnement de prod (avoir les bonnes libs avec les bonnes versions ...)
Donc quand tu dev, tu dois le faire dans les mêmes conditions que ton image Docker, pour être sûr que ton poste local n'interfère pas.
Maintenant, tu sais comment faire ça, facilement.
Voilà
Imrane 🏖
La newsletter pour ne rien louper
Rejoins les 2500 lecteurs de la newsletter pour obtenir des conseils, des stratégies et des ressources pour développer et monétiser tes compétences Tech.