【问题标题】:How to use a python virtual environment copied to a docker container如何使用复制到 docker 容器的 python 虚拟环境
【发布时间】:2019-11-11 11:54:19
【问题描述】:

我有一个 python 包,我已经安装并根据我的需要进行了修改,存储在 venv 文件夹中。我想使用:

RUN source venv/bin/activate

在我的 Dockerfile 中(当然是在将其复制到容器中之后)可以解决我的问题,但 this answer 的 cmets 显示它没有。之后,我遇到了this article,它展示了如何在 docker 容器中设置新的 venv,但没有回答我的问题。许多其他答案让我无休止地追逐,所以我决定在这里问。希望一个好的答案能解决我的问题,并为未来将面临这个问题的人提供 docker 容器中的自定义 python 包。

我的问题:
如何使用复制到 docker 容器中的 venv?

【问题讨论】:

  • 通常虚拟环境是在构建镜像的过程中从requirements.txt重建的。
  • 对,但是这些包不会有我的自定义更改。
  • 然后将自定义包添加到构建过程中。
  • 只是将它们复制到文件夹中?还是我在这里缺少其他东西?
  • 如果包中包含 C 代码,则不太可能正常工作。

标签: python docker


【解决方案1】:

一般来说,你不能在任何地方复制虚拟环境,无论是 Docker 还是其他地方。它们往往与一个非常具体的文件系统路径和一个非常具体的 Python 安装相关联。如果你知道你有 exact 相同的 Python 二进制文件,并且你将它复制到 exact 相同的文件系统路径,你可能可以按原样复制它,但是构建系统会非常脆弱。

这也是你通常不需要 Docker 中的虚拟环境的情况。 Docker 映像提供了与您在非 Docker 上下文中使用虚拟环境相同的隔离 Python 安装。如果您通常通过运行来设置虚拟环境

python3 -m venv vpy
. vpy/bin/activate
pip install -r requirements.txt

然后您可以使用类似 Dockerfile 的等效安装

FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

在 cmets 中,您暗示手动修改已安装的软件包。这通常不是最佳实践(如果您更改的软件包中有关键安全更新怎么办?如果您的同事需要处理您的项目而不是您的计算机怎么办?)。您可以使用 diff(1) 之类的工具制作一个补丁文件来描述更改的内容,并将修改后的文件与原始文件进行比较。如果你有,那么你可以做类似的事情

COPY local.patch /app/
RUN cd $(python3 -c 'import sysconfig; print(sysconfig.get_path("platlib"))') \
 && patch -p0 < /app/local.patch

请务必注意,每个 RUN 命令都会在新容器中启动一个新 shell。因此,最后一个示例中的cd 命令 影响此 RUN 命令,以后不会影响。在您提出的RUN source ... 命令中,由此设置的环境变量将在该 RUN 命令结束时丢失。 (另请注意,source 不是标准的 shell 命令,并且不适用于例如基于 Alpine 的图像,但 . 是等效的并且是标准的。)

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多