web-dev-qa-db-fra.com

Est-ce que virtualenv sert à quelque chose (en production) avec docker

Pour le développement, nous utilisons virtualenv pour avoir un développement isolé en ce qui concerne les dépendances. À partir de cette question il semble que le déploiement d'applications Python dans un virtualenv est recommandé.

Nous commençons maintenant à utiliser docker pour le déploiement. Cela fournit un environnement plus isolé, je remets donc en question l'utilisation de virtualenv dans un conteneur Docker. Dans le cas d’une application unique, je ne pense pas que virtualenv ait un but, car le menu fixe fournit déjà l’isolation. Dans le cas où plusieurs applications sont déployées sur un même conteneur Docker, je pense que virtualenv a un objectif, car les applications peuvent avoir des dépendances conflictuelles. 

Est-ce que virtualenv doit être utilisé lorsqu'une seule application est déployée dans un conteneur Docker?

Le menu fixe doit-il contenir plusieurs applications ou une seule application par conteneur?

Si tel est le cas, virtualenv doit-il être utilisé lors du déploiement d'un conteneur avec plusieurs applications?

48
siebz0r

Virtualenv a été créé bien avant Docker. Aujourd'hui, je me penche vers docker au lieu de virtualenv pour ces raisons:

  • Virtualenv signifie toujours que les utilisateurs de votre produit doivent télécharger des œufs. Avec docker, ils obtiennent quelque chose qui est "connu pour fonctionner". Sans attaches.
  • Docker peut faire beaucoup plus que virtualenv (comme créer un environnement propre lorsque vous avez des produits nécessitant différentes versions de Python).

Le principal inconvénient de Docker était le faible support Windows. Cela a changé avec la version pour Windows 10.

En ce qui concerne "combien d'applications par conteneur", la politique habituelle est 1. 

57
Aaron Digulla

Oui. Vous devriez toujours utiliser virtualenv. En outre, vous devriez maintenant construire des roues au lieu d’œufs. Enfin, vous devez vous assurer que votre image Docker est simple et efficace en construisant vos roues dans un conteneur avec les outils de génération complets et en n’instituant aucun outil de construction dans votre conteneur d’application.

Vous devriez lire cet excellent article. https://glyph.twistedmatrix.com/2015/03/docker-deploy-double-dutch.html

La clé à emporter est

C’est vrai que dans beaucoup de cas, peut-être même dans la plupart des cas, il suffit d’installer insérer dans le système Python avec Pip fonctionne bien; cependant, pour plus applications élaborées, vous voudrez peut-être invoquer un outil fourni par votre conteneur de base implémenté en Python, mais qui nécessite des dépendances gérées par l'hôte. En mettant les choses dans une virtualenv indépendamment, nous conservons les choses mises en place par la base Le système de paquets d’image est parfaitement séparé des choses que notre l'application est la construction, ce qui signifie qu'il ne devrait pas y avoir d'imprévu interactions, quelle que soit la complexité de l'utilisation de l'application Python pourrait être.

27
Bruno Bronosky

Introduire virtualenv est très facile, je vous conseille donc de ne pas l'utiliser sans votre conteneur Docker. 

Si le besoin s'en fait sentir, alors vous pourrez peut-être l'installer. Exécuter "pip freeze> Requirements.txt" vous donnera tous vos paquets python. Cependant, je doute que vous ayez besoin de virtualenv à l’intérieur d’un conteneur docker, car la création d’un autre conteneur serait une alternative préférable. 

Je ne recommanderais pas d'avoir plus d'une application dans un seul conteneur. À ce stade, votre conteneur en fait trop.

11
musabaloyi

Si quelqu'un veut remplacer virtualenv complètement en utilisant docker, il le peut.

Créez simplement un fichier Dockerfile différent pour un environnement différent et utilisez le port et les volumes nécessaires à votre environnement.

Comme exemple de développement, vous pouvez utiliser ce projet . Exécuter docker composer et commencer à coder. Créez vos propres fichiers Docker pour différents environnements, tels que le test, le stockage intermédiaire et la production, en mettant votre journal et vos données en volume.

Ce lien est également utile https://vsupalov.com/docker-python-development/ .

0
Abhijit Maity

J'utilise les deux parce qu'avec cela, vous pouvez plus facilement utiliser des constructions multi-étapes et déplacer simplement les dépendances que vous avez construites une étape dans des images/couches ultérieures. Exemple peut être trouvé ici .

0
r0bnet