11 votes

Est-ce une bonne pratique de Docker d'utiliser le volume pour le code ?

L'instruction VOLUME doit être utilisée pour exposer toute zone de stockage de base de données, tout stockage de configuration ou tout fichier/dossier créé par votre conteneur docker. Nous vous encourageons vivement à utiliser VOLUME pour toutes les parties mutables et/ou utilisables par l'utilisateur de votre image.

allez-vous stocker votre code en volume ?

Comme vos fichiers jar. Il pourrait être un peu pratique de déployer l'application sans reconstruire l'image.
Y a-t-il des considérations à prendre en compte si l'on stocke le code en volume ? comme les performances, la sécurité ou autres.

14voto

BMitch Points 3744

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.

4voto

Robert Points 357

Vous dites :

Il pourrait être un peu pratique de déployer l'application sans reconstruire l'image.

Au lieu de cela, il y a beaucoup d'avantages à encapsuler la version de votre application dans une image. Vous pouvez facilement déployer votre application en ne déployant que l'image. Le fait que vous utilisiez un volume pour le code de l'application vous amène à orchestrer une autre méthode de déploiement pour mettre à jour ce volume également.

Et vous devez (éventuellement) faire correspondre le bocal avec la bonne version de l'image.

En ce qui concerne la sécurité ou les performances, je ne pense pas qu'il y ait de considérations particulières.

Quoi qu'il en soit, il n'est pas courant d'utiliser des volumes pour cela. Et comme le dit @BMitch, utiliser VOLUME à l'intérieur de Dockerfile est un peu délicat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X