Environnement de développement avec Docker

developpement devops Sep 16, 2022

Hello,

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.