Configurer un conteneur avec des variables d’environnement
Rappelez-vous du guide 10 : server.js lit une variable APP_NAME. Elle n'a encore jamais été utilisée.
Ce qu'est une variable d'environnement
Une variable d'environnement est une information mise à disposition d'un programme au moment où il démarre, sous la forme d'un nom et d'une valeur, par exemple APP_NAME=Carnet de Julie. Le programme peut lire cette valeur pendant son exécution, sans qu'elle soit écrite en dur dans son code source.
C'est précisément ce que fait server.js depuis le guide 10 : const APP_NAME = process.env.APP_NAME || 'Mini-Carnet';. Si la variable APP_NAME existe au démarrage, elle est utilisée ; sinon, « Mini-Carnet » sert de valeur par défaut.
Passer une variable avec -e
L'option -e, pour « environment », définit une variable d'environnement au moment de docker run. Arrêtez le conteneur actuel, puis relancez-en un nouveau avec un nom personnalisé :
Ouvrez http://localhost:3000 : le titre affiche désormais « Bienvenue sur Carnet de Julie 👋 ». Le code de l'application n'a pourtant pas bougé d'un octet, et l'image n'a pas été reconstruite : seule la valeur transmise au démarrage du conteneur a changé.
Plusieurs variables à la fois
L'option -e peut être répétée autant de fois que nécessaire. Vous pouvez par exemple changer le port interne écouté par l'application en même temps que son nom :
Ici, PORT=4000 change le port interne réellement écouté par Mini-Carnet, ce qui explique pourquoi le port du conteneur, dans -p 3000:4000, doit lui aussi être ajusté à 4000 pour rester cohérent avec ce que le guide précédent vous a appris.
Pourquoi c'est une bien meilleure approche que de modifier le code
Sans variables d'environnement, personnaliser une application obligerait à modifier son code source directement, puis à reconstruire une image différente pour chaque configuration souhaitée : une pour chaque nom d'utilisateur, une pour chaque environnement. Avec des variables d'environnement, une seule et même image sert dans tous les contextes : chez vous en test, sur le serveur d'une entreprise en production, avec des valeurs différentes à chaque fois, sans jamais reconstruire l'image entre les deux.
Une information qui peut changer selon l'endroit où l'application tourne (un nom, une adresse de base de données, une clé d'accès) devrait presque toujours être une variable d'environnement, jamais une valeur écrite en dur dans le code. C'est un réflexe qui rejoint directement l'esprit de .dockerignore et du fichier .env vus au guide 14 : garder les informations sensibles ou changeantes en dehors du code lui-même.
Vérifiez que vous avez compris
Vous lancez un conteneur sans utiliser l'option -e du tout. Quel nom Mini-Carnet va-t-il afficher ?
« Mini-Carnet », la valeur par défaut définie dans server.js avec process.env.APP_NAME || 'Mini-Carnet'. Sans variable APP_NAME fournie au démarrage, le code retombe automatiquement sur cette valeur par défaut, prévue précisément pour ce cas.