web-dev-qa-db-fra.com

Comment faire fonctionner pipenv dans docker?

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.

25
Mulgard

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:

  1. Vous devez utiliser --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 virtualenvs
  2. Vous devez utiliser --deploy drapeau, votre construction échouera si votre Pipfile.lock n'est pas à jour
  3. Vous devez utiliser --ignore-pipfile, pour ne pas déranger notre configuration

Vé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

55
sobolevn

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.

7
Kalior

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
3
James Taylor