如何在码头工人中运行pipenv?

Mul*_*ard 31 docker pipenv

我在我的码头工人安装pipenv:

RUN pip install pipenv
RUN cd /my/app/path/ && pipenv install
RUN cd /my/app/path/ && pipenv shell
Run Code Online (Sandbox Code Playgroud)

我得到错误:

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 Code Online (Sandbox Code Playgroud)

如果我跑

RUN cd /my/app/path/ && pipenv install --system 
Run Code Online (Sandbox Code Playgroud)

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

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 Code Online (Sandbox Code Playgroud)

但是,当我改为做以下事情时:

RUN pip install pipenv
RUN cd /my/app/path && pipenv install
RUN cd /my/app/path && pipenv install --system
Run Code Online (Sandbox Code Playgroud)

这是工作...

所以有两个问题:第一:为什么pipenv shell给我这个错误呢?第二:为什么我必须要做pipenv install才能pipenv install --system让它运转起来?

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

sob*_*evn 61

考虑到你的问题,我知道最简单的方法是更新到最新版本pipenv.它仍处于开发阶段,所以很快就会解决问题.

我们使用pipenvdocker生产.我们真的很喜欢它.有几点需要注意:

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

查看官方文档以确保此信息是最新的.

总而言之:

pipenv install --system --deploy --ignore-pipfile
Run Code Online (Sandbox Code Playgroud)

还有一件事.如果您Dockerfile在开发和生产中使用相同的内容,那么--dev仅对开发环境使用flag 也是非常好的.

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

  • 请考虑这个答案/sf/answers/3892760021/!官方建议不再使用 `--system` 标志,这是有充分理由的! (3认同)
  • 我很想看看你们如何能够使这个工作。我试图用所有给定的参数进行pipenv安装,但始终会失败,并显示类似的错误 (2认同)
  • “--ignore-pipfile”与“--deploy”结合使用时有什么影响吗? (2认同)

小智 14

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

...我相信你们都注意到,大多数容器都没有使用virtualenvs部署,我相信这样做的目的是保持苗条并通过尽可能少地安装来减少攻击表面积

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

相反,解决方案将是运行(如此处的其他答案所述):

RUN pipenv install --deploy --ignore-pipfile

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

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


muo*_*uon 11

我只是生成一个requirements.txt文件并使用正常的pip.

\n
RUN  pip install pipenv  \\\n    && pipenv requirements > requirements.txt \\\n    && pip install -r requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

您甚至可以pipenv通过在构建容器之前生成需求文件来跳过 Dockerfile 中的安装。

\n

由于这不会在pipenv托管虚拟环境中安装依赖项,因此无需pipenvdocker-compose命令中担心。

\n
command: >\n    - sh \n    - -c \n    - |\n      python myscript.py\n      python myapp.py\n
Run Code Online (Sandbox Code Playgroud)\n

这篇 Python\xe2\x87\x92Speed 文章对我很有帮助,其中还包括poetry和的需求文件生成pip-tools

\n
\n

先前版本,2022-04 之前

\n

requirements.txt一代人曾经是 的一部分pipenv lock。如果您坚持使用旧版本,请使用此版本。但除此之外,只需升级即可。

\n
RUN  pip install pipenv  \\\n    && pipenv lock --keep-outdated --requirements > requirements.txt \\\n    && pip install -r requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n

  • 非常感谢您的解决方案!我尝试过,但失败并出现错误“错误:没有这样的选项:--requirements”。这是由于 bcs pipelinenv 删除了 `-r || 造成的 --requirements` 标志并为其提供专用命令 --&gt; `pipenv requests`。请注意,这只是将要求打印到标准输出,要创建一个requirements.txt文件,需要shell输出重定向--&gt;“pipenvrequirements&gt;requirements.txt”。对于删除时的确切版本,我太懒了(抱歉),但这里是相关[doc]的链接(https://pipenv.pypa.io/en/latest/advanced/#generate-a-requirements- TXT) (2认同)

Jam*_*lor 9

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

CMD ["pipenv", "run", "python", "my/app.py"]
Run Code Online (Sandbox Code Playgroud)

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

我实际上更喜欢方法C. Sweet提及。如果你能逃脱提前创建虚拟环境,只是在复制它(设置PIPENV_VENV_IN_PROJECT然后使用嵌套FROM之后COPY --from=builder-image),你并不需要python,也不pipenv也不pipenv依赖于你的最终容器。这大大减少了最终图像的大小。

Dockerfile

WORKDIR /etc/service/
CMD ["sh", "/etc/service/init.sh"]
Run Code Online (Sandbox Code Playgroud)

init.sh

source /etc/service/my/.venv/bin/activate
python my/app.py
Run Code Online (Sandbox Code Playgroud)

  • “你不需要 `python`” - 抱歉,在部署 python 应用程序时,如何避免在容器中包含 python? (4认同)