73

我在我的 docker 中安装 pipenv:

RUN pip install pipenv
RUN cd /my/app/path/ && pipenv install
RUN cd /my/app/path/ && pipenv shell

我收到错误:

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'

如果我跑

RUN cd /my/app/path/ && pipenv install --system 

相反,我收到另一个错误:

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

但是当我改为执行以下操作时:

RUN pip install pipenv
RUN cd /my/app/path && pipenv install
RUN cd /my/app/path && pipenv install --system

这是工作...

所以有两个问题:第一:为什么pipenv shell给我这个错误,第二:为什么我必须先做pipenv install才能pipenv install --system让它工作?

我想使用 pipenv 创建具有不同 python 版本和不同依赖版本的虚拟环境。

4

5 回答 5

149

考虑到您的问题,据我所知,最简单的方法是更新到最新版本的pipenv. 它仍在开发中,因此问题很快得到解决。

我们在生产中使用pipenvwith 。docker我们真的很喜欢它。有几件事情要记住:

  1. 您需要使用--system标志,因此它将所有软件包安装到系统 python 中,而不是安装到virtualenv. 由于docker容器不需要有virtualenvs
  2. 您需要使用--deploy标志,因此如果您Pipfile.lock的版本过时,您的构建将失败
  3. 你需要使用--ignore-pipfile,所以它不会弄乱我们的设置

检查官方文档以确保此信息是最新的。

总而言之:

pipenv install --system --deploy --ignore-pipfile

还有一件事。如果您在开发和生产中都使用相同的标记,那么仅在开发环境中Dockerfile使用标志会非常好。--dev

另外,查看我们的django项目模板以查看完整示例:wemake-django-template

于 2018-04-07T08:50:24.183 回答
56

pipenv 文档不再正式建议在 docker--system实例中使用该标志。相反,他们建议使用虚拟环境,因为“它用于部署到成熟的操作系统上”。这是警告:

...正如我相信你们都注意到的那样,大多数容器都是在没有 virtualenvs 的情况下部署的,我相信其目的是通过尽可能少地安装来保持苗条并减少攻击面

https://github.com/pypa/pipenv/pull/2762中所述。

相反,解决方案是运行(如此处不同答案所述):

RUN pipenv install --deploy --ignore-pipfile

然后在所有对 python 的调用前加上pipenv run,例如CMD ["pipenv", "run", "python", "hello.py"]

附言。我本来想将此作为对已接受答案的评论,但我没有声誉。

于 2019-04-10T10:56:31.250 回答
11

这个问题的直接答案是不使用shell,而是run

CMD ["pipenv", "run", "python", "my/app.py"]

如果您需要更大的灵活性,您还pipenv run sh init.sh可以创建一个使用所有pipenv环境变量初始化的 shell。

我实际上更喜欢C. Sweet提到的方法。如果您可以预先构建您的虚拟环境并简单地将其复制过来(设置PIPENV_VENV_IN_PROJECT然后使用嵌套的FROM后跟) ,COPY --from=builder-image那么您在最终容器中不需要python也不依赖项。这大大减小了最终图像的大小。pipenvpipenv

Dockerfile

WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]

init.sh

source /etc/service/my/.venv/bin/activate
python my/app.py
于 2018-08-26T01:10:24.747 回答
5

以下替代方案对我来说是最好的:

    RUN  pip install pipenv  \
    && pipenv lock --keep-outdated --requirements > requirements.txt \
    && pip install -r requirements.txt

由于这不会在 pipenv'a virtualenv 中安装依赖项,因此无需担心 docker-compose 命令中的 pipenv。

command: >
    - sh 
    - -c 
    - |
      python myscript.py
      python myapp.py

以下参考对我有帮助,包括诗歌、pip-tools 参考 PS 我不是作者

于 2021-08-14T22:49:43.077 回答
0

最好不要直接使用 pipenv,因为你的容器中通常不需要 virtualenv。

有一个名为 micropipenv 的工具,您可以在容器中使用它来代替 pipenv。

https://github.com/thoth-station/micropipenv

micropipenv 用例

为什么我应该使用micropipenv而不是Pipenv or Poetry

  • 我想要一个“统管一切”的工具——一个支持所有 Python 依赖锁文件管理器(pip-tools、Poetry、Pipenv)的轻量级工具,让用户决定在容器化环境中部署 Python 应用程序时要使用什么(例如 Kubernetes、OpenShift、...)。

  • 我想要一个快速且简约的工具来在 CI 中安装软件包。

  • 我希望容器化的 Python 应用程序尽可能小,并且在生产中构建和运行 Python 应用程序所需的软件最少。

  • 我想将 Pipenv/Poetry 生成的文件转换为与 pip-tools 兼容的输出。

  • 我不想安装 Pipenv/Poetry,但我想运行一个使用 Pipenv/Poetry 进行依赖管理的项目(例如受限环境)。

  • 我的 Pipenv 安装坏了,Pipenv upstream did not issue any new Pipenv release <https://github.com/pypa/pipenv/issues/4058>_.

  • 我想将我的应用程序部署到生产环境中,并且我的应用程序依赖项由 Pipenv/Poetry 管理(依赖项已经解决),但我不想在生产环境中运行 Pipenv/Poetry(例如 OpenShift 的 s2i 构建过程)。

于 2021-07-16T14:39:48.443 回答