Je ne recommande pas d'utiliser un VOLUME
dans le Dockerfile pour tout ce qui concerne les versions actuelles de docker (actuelles étant toutes les versions de docker depuis l'introduction des volumes nommés). L'inclusion d'un VOLUME
Le commandement a de multiples inconvénients, notamment :
- impossibilité éventuelle de modifier le contenu à cet emplacement de l'image avec toute étape ultérieure ou image enfant (ce comportement semble être différent selon les scénarios et les versions de Docker)
- la possibilité de créer des volumes dont le nom n'est qu'un hash qui encombre l'arborescence de la base de données.
docker volume ls
et sont très difficiles à retrouver et à réutiliser ultérieurement si vous aviez besoin des données à l'intérieur de l'entreprise.
- pour votre code changeant, si vous le placez dans un volume et recréez votre conteneur à partir d'une nouvelle version de l'image, le volume aura toujours l'ancienne copie de votre code à moins que vous ne mettiez à jour ce volume vous-même (la caractéristique clé des volumes est la persistance des données que vous ne voulez pas conserver entre les itérations)
Je vous recommande de placer vos données dans un volume que vous définissez sur l'ordinateur de l'entreprise. docker run
en ligne de commande ou dans un fichier docker-compose.yml. Les volumes qui y sont définis peuvent avoir un nom ou correspondre à un chemin sur l'hôte docker. Et vous pouvez faire de n'importe quel dossier ou fichier un volume sans avoir besoin de le définir dans le Dockerfile. Les volumes définis à cette étape n'ont pas d'impact sur l'image, ce qui vous permet d'étendre une image sans être empêché d'apporter des modifications à un répertoire.
Pour votre code, c'est une bonne pratique courante d'injecter du code avec un volume s'il est interprété (par exemple javascript) ou déjà compilé (par exemple un fichier jar) pendant le développement de l'application. Vous définissez le volume sur le conteneur (pas le Dockerfile), et vous superposez le code ou les binaires qui ont également été copiés dans l'image en utilisant les mêmes noms de fichiers. Cela vous permet d'itérer rapidement dans le développement sans avoir à reconstruire fréquemment l'image. En fonction de l'application, vous pourrez peut-être recharger le code en direct, sinon, un redémarrage du conteneur devrait suffire pour voir la dernière modification. Et une fois le développement terminé, vous reconstruisez l'image avec votre code actuel et vous l'expédiez à quelqu'un qui peut l'utiliser sans avoir besoin du montage de volume pour le code.
J'ai aussi J'ai parlé dans mon blog de mes préoccupations concernant les volumes dans les Dockerfiles. si vous souhaitez obtenir plus de détails à ce sujet.