J'installe pipenv dans mon menu fixe:
RUN pip install pipenv
RUN cd /my/app/path/ && pipenv install
RUN cd /my/app/path/ && pipenv Shell
Je reçois l'erreur:
Traceback (most recent call last):
File "/usr/local/bin/pipenv", line 11, in <module>
sys.exit(cli())
File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 722, in __call__
return self.main(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 697, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 1066, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 895, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 535, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 2057, in Shell
do_Shell(three=three, python=python, fancy=fancy, Shell_args=Shell_args)
File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1952, in do_Shell
Shell = os.path.abspath(PIPENV_Shell)
File "/usr/lib/python2.7/posixpath.py", line 360, in abspath
if not isabs(path):
File "/usr/lib/python2.7/posixpath.py", line 54, in isabs
return s.startswith('/')
AttributeError: 'NoneType' object has no attribute 'startswith'
Si je cours
RUN cd /my/app/path/ && pipenv install --system
au lieu de cela, je reçois une autre erreur:
build 30-Sep-2017 16:50:45 Step 5/9 : RUN cd /my/app/path && pipenv install --system
build 30-Sep-2017 16:50:45 ---> Running in cffd31633074
build 30-Sep-2017 16:50:46 [91mPipfile.lock not found, creating…
build 30-Sep-2017 16:50:46 [0m[91mLocking [dev-packages] dependencies…
build 30-Sep-2017 16:50:46 [0m[91mLocking [packages] dependencies…
build 30-Sep-2017 16:50:49 [0m[91mCRITICAL:pip.utils:Error [Errno 2] No such file or directory while executing command python setup.py Egg_info
build 30-Sep-2017 16:50:49 [0m[91mTraceback (most recent call last):
build 30-Sep-2017 16:50:49 File "/usr/local/bin/pipenv", line 11, in <module>
build 30-Sep-2017 16:50:49 sys.exit(cli())
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 722, in __call__
build 30-Sep-2017 16:50:49 [0m[91m return self.main(*args, **kwargs)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 697, in main
build 30-Sep-2017 16:50:49 [0m[91m rv = self.invoke(ctx)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 1066, in invoke
build 30-Sep-2017 16:50:49 [0m[91m return _process_result(sub_ctx.command.invoke(sub_ctx))
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 895, in invoke
build 30-Sep-2017 16:50:49 [0m[91m return ctx.invoke(self.callback, **ctx.params)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/vendor/click/core.py", line 535, in invoke
build 30-Sep-2017 16:50:49 return callback(*args, **kwargs)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1782, in install
build 30-Sep-2017 16:50:49 [0m[91m do_init(dev=dev, allow_global=system, ignore_pipfile=ignore_pipfile, system=system, skip_lock=skip_lock, verbose=verbose, concurrent=concurrent, deploy=deploy)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1290, in do_init
build 30-Sep-2017 16:50:49 [0m[91m do_lock(system=system)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/cli.py", line 1080, in do_lock
build 30-Sep-2017 16:50:49 [0m[91m pre=pre
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/utils.py", line 421, in resolve_deps
build 30-Sep-2017 16:50:49 [0m[91m resolved_tree.update(resolver.resolve())
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 101, in resolve
build 30-Sep-2017 16:50:49 [0m[91m has_changed, best_matches = self._resolve_one_round()
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 199, in _resolve_one_round
build 30-Sep-2017 16:50:49 [0m[91m for dep in self._iter_dependencies(best_match):
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/resolver.py", line 293, in _iter_dependencies
build 30-Sep-2017 16:50:49 dependencies = self.repository.get_dependencies(ireq)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/piptools/repositories/pypi.py", line 171, in get_dependencies
build 30-Sep-2017 16:50:49 result = reqset._prepare_file(self.Finder, ireq)
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_set.py", line 639, in _prepare_file
build 30-Sep-2017 16:50:49 [0m[91m abstract_dist.prep_for_dist()
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_set.py", line 134, in prep_for_dist
build 30-Sep-2017 16:50:49 [0m[91m self.req_to_install.run_Egg_info()
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/req/req_install.py", line 438, in run_Egg_info
build 30-Sep-2017 16:50:49 [0m[91m command_desc='python setup.py Egg_info')
build 30-Sep-2017 16:50:49 File "/usr/local/lib/python2.7/dist-packages/pipenv/patched/pip/utils/__init__.py", line 667, in call_subprocess
build 30-Sep-2017 16:50:49 [0m[91m cwd=cwd, env=env)
build 30-Sep-2017 16:50:49 File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
build 30-Sep-2017 16:50:49 [0m[91m errread, errwrite)
build 30-Sep-2017 16:50:49 File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
build 30-Sep-2017 16:50:49 [0m[91m raise child_exception
build 30-Sep-2017 16:50:49 OSError: [Errno 2] No such file or directory
error 30-Sep-2017 16:50:49 The command '/bin/sh -c cd /opt/supercrunch/function-service/lib && pipenv install --system' returned a non-zero code: 1
build 30-Sep-2017 16:50:49 [0mSending build context to Docker daemon 40.96 kB
Mais quand je fais plutôt la chose suivante:
RUN pip install pipenv
RUN cd /my/app/path && pipenv install
RUN cd /my/app/path && pipenv install --system
Ça fonctionne...
Donc, deux questions: premièrement: pourquoi pipenv Shell
me donnant cette erreur et Deuxièmement: Pourquoi dois-je faire pipenv install
avant pipenv install --system
pour que ça marche?
Je voudrais utiliser pipenv pour créer des environnements virtuels avec différentes versions de python et versions de dépendance différentes.
Compte tenu de votre problème, comme je le connais, le moyen le plus simple est de mettre à jour la dernière version de pipenv
. Il est encore en développement, donc les problèmes sont résolus très bientôt.
Nous utilisons pipenv
avec docker
en production. Et on aime vraiment ça. Il y a plusieurs choses à garder à l'esprit:
--system
drapeau, il installera donc tous les paquets dans le système python et non dans le virtualenv
. Depuis docker
, les conteneurs n'ont pas besoin d'avoir virtualenv
s--deploy
drapeau, votre construction échouera si votre Pipfile.lock
n'est pas à jour--ignore-pipfile
, pour ne pas déranger notre configurationVérifiez les documents officiels pour vous assurer que ces informations sont à jour.
En tout:
pipenv install --system --deploy --ignore-pipfile
Il y a aussi une dernière chose. Si vous utilisez le même Dockerfile
pour le développement et la production, il serait très agréable d'utiliser également --dev
indicateur pour l’environnement de développement uniquement.
Consultez également notre modèle de projet Django
pour voir l'exemple complet: wemake-Django-template
La documentation de pipenv ne recommande plus officiellement d’utiliser le --system
drapeau dans les instances de menu fixe. Au lieu de cela, ils suggèrent d'utiliser des environnements virtuels, comme "c'est pour le déploiement sur un système d'exploitation à part entière". Ceci est avec la mise en garde:
... la plupart des conteneurs sont déployés sans virtualenvs, comme vous le remarquerez tous les deux, le but est de rester mince et de réduire la surface d'attaque en installant le moins possible
Comme indiqué dans https://github.com/pypa/pipenv/pull/2762 .
Au lieu de cela, la solution serait d’exécuter (comme indiqué dans une réponse différente ici):
RUN pipenv install --deploy --ignore-pipfile
Et puis préfixez tous les appels à python avec pipenv run
, par exemple. CMD ["pipenv", "run", "python", "hello.py"]
Ps. J'aurais voulu mettre cela comme un commentaire sur la réponse acceptée, mais je n'ai pas la réputation.
La réponse directe à cette question est de ne pas utiliser Shell
, mais plutôt run
:
CMD ["pipenv", "run", "python", "my/app.py"]
Si vous avez besoin de plus de flexibilité, vous pouvez également pipenv run sh init.sh
, Ce qui créerait un shell initialisé avec toutes les variables d'environnement pipenv
.
Je préfère en fait l'approche C. Sweet mentionne. Si vous pouvez vous contenter de pré-construire votre environnement virtuel et de le copier (en définissant PIPENV_VENV_IN_PROJECT
Puis en utilisant un imbriqué FROM
suivi de COPY --from=builder-image
), Vous n'avez pas besoin de python
ni pipenv
ni pipenv
dépendances dans votre conteneur final. Ceci réduit considérablement la taille de l'image finale.
Dockerfile
:
WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]
init.sh
:
source /etc/service/my/.venv/bin/activate
python my/app.py