Dockerfile构建失败-找到Pipenv和Pyenv多个版本的Python

问题描述 投票:0回答:1

问题:如何修复Dockerfile以正确冻结Requirements.txt并成功构建?

我正在使用Pyenv和Pipenv部署Python脚本的Dockerfile进行本地开发。

在将Piplock文件冻结到requirements.txt的构建步骤中,我收到以下错误:

错误:“-python”的值无效:路径处应使用Python/用户/jz/.local/share/virtualenvs/quanter-TP0oWHoL/bin/python3确实不存在

我的Dockerfile是:

FROM python:3.7
RUN pip install pipenv
COPY Pipfile* /tmp/
RUN cd /tmp && pipenv --python /Users/x/.local/share/virtualenvs/quanter-TP0oWHoL/bin/python3 lock --requirements > requirements.txt
ENV RDKAFKA_INSTALL=system
RUN pip install -r /tmp/requirements.txt
COPY . /tmp/app/
RUN pip install /tmp/app/
CMD ["python", "./tmp/app/main.py"]

本地Pipenv环境的创建提供了有关解释器的此信息,(在Dockerfile中使用了该信息:]

使用/usr/local/opt/pyenv/versions/3.8.0/bin/python3(3.8.0)创建虚拟环境…⠙创建虚拟环境...使用基本前缀'/usr/local/opt/pyenv/versions/3.8.0'中的新python可执行文件/Users/x/.local/share/virtualenvs/quanter-TP0oWHoL/bin/python3也在以下位置创建可执行文件/Users/x/.local/share/virtualenvs/quanter-TP0oWHoL/bin/python

Pyenv在本地使用3.8.0:

pyenv versions
system
3.7.5
* 3.8.0 (set by /Users/x/Projects/quanter/.python-version)

任何帮助完成此工作的人,将不胜感激!谢谢。

python-3.x docker dockerfile pipenv pyenv
1个回答
0
投票

原始错误来自pipenv在给定路径上找不到python可执行文件的想法。它是硬编码的,但是在每个全新的构建中,pipenv将使用不同的名称创建env。看一下这个有趣的讨论:How does pipenv know the virtualenv for the current project?,似乎可以预见,但是应该有一个更好的解决方案。

首先,您不需要直接指定python可执行文件的路径,因为python映像仅随一个系统python安装一起提供,例如默认情况下,它将通过python可用(当然,您可以手动使用不同版本的python创建不同的环境)。

第二,您可以在docker env中以更多pipenv处理nicer and preferable way,而不是将pipenv转换为点子式流程。看下面的例子:

FROM python:3.7

COPY Pipfile /
COPY Pipfile.lock /

RUN pip3 install pipenv \
    && pipenv install --system --deploy --ignore-pipfile 

值得考虑的几点注意事项:

  1. Pipfile.lock提交到VCS中。在这种情况下,可以确保在每个环境中您都具有完全相同版本的软件包及其依赖项。
  2. 您可能对--system选项感兴趣。也就是说,将依赖项安装到系统中而不是virtualenv(这是您期望的)。但是根据此答案:https://stackoverflow.com/a/55610857/9926721尚未正式推荐。但是,仍然很受欢迎的项目wemake-django-template也使用它。
  3. 考虑拆分环境。有一个有用的标志--dev。没有更多的需求文件。处理它更有效的方法。
© www.soinside.com 2019 - 2024. All rights reserved.