首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Dockerfile中激活python虚拟

在Dockerfile中激活python虚拟
EN

Stack Overflow用户
提问于 2018-02-01 11:46:02
回答 6查看 79.9K关注 0票数 78

我有一个Dockerfile,在这里我尝试激活python之后,它应该安装这个env中的所有依赖项。然而,所有的东西仍然在全球范围内安装。我用了不同的方法,但都不管用。我也不会有任何错误。哪里有问题?

  1. ENV PATH $PATH:env/bin
  2. ENV PATH $PATH:env/bin/activate
  3. RUN . env/bin/activate

我还跟踪了Google上python运行时映像的Dockerfile配置示例,它基本上与上面的内容相同。

设置这些环境变量与运行源代码/env/bin/activate相同。

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

此外,ENV VIRTUAL_ENV /env意味着什么以及它是如何使用的?

EN

回答 6

Stack Overflow用户

发布于 2018-02-01 12:29:55

您不需要在DockerContainer.中使用虚拟环境。

virtualenv用于依赖隔离。您希望防止安装的任何依赖项或包在应用程序之间泄漏。Docker实现了同样的功能,它隔离了容器中的依赖项,防止了容器之间和应用程序之间的泄漏。

因此,除非您在同一个容器中运行多个应用程序,否则在Docker容器中使用virtualenv是没有意义的,如果是这样的话,我会说您做错了什么,解决方案是以更好的方式架构您的应用程序,并将它们拆分到多个容器中。

编辑2022:如果这个答案获得了大量的视图,我认为在4年后的今天,我意识到实际上在Docker映像中使用虚拟环境是有意义的,特别是在进行多阶段构建时:

代码语言:javascript
运行
复制
FROM python:3.9-slim as compiler
ENV PYTHONUNBUFFERED 1

WORKDIR /app/

RUN python -m venv /opt/venv
# Enable venv
ENV PATH="/opt/venv/bin:$PATH"

COPY ./requirements.txt /app/requirements.txt
RUN pip install -Ur requirements.txt

FROM python:3.9-slim as runner
WORKDIR /app/
COPY --from=compiler /opt/venv /opt/venv

# Enable venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . /app/
CMD ["python", "app.py", ]

在上面的Dockerfile示例中,我们在/opt/venv上创建一个虚拟and并使用ENV语句激活它,然后我们将所有依赖项安装到这个/opt/venv中,并且可以简单地将这个文件夹复制到我们构建的runner阶段。这可以帮助最小化码头图像大小。

票数 76
EN

Stack Overflow用户

发布于 2018-08-19 16:13:56

在容器中使用virtualenv有完全合理的理由。

您不一定需要激活virtualenv来安装或使用它。尝试直接从virtualenv的bin目录调用可执行文件:

代码语言:javascript
运行
复制
FROM python:2.7

RUN virtualenv /ve
RUN /ve/bin/pip install somepackage

CMD ["/ve/bin/python", "yourcode.py"]

您还可以设置PATH环境变量,以便所有进一步的Python命令都使用虚拟环境中的二进制文件,如https://pythonspeed.com/articles/activate-virtualenv-dockerfile/中所述。

代码语言:javascript
运行
复制
FROM python:2.7

RUN virtualenv /ve
ENV PATH="/ve/bin:$PATH"
RUN pip install somepackage

CMD ["python", "yourcode.py"]
票数 66
EN

Stack Overflow用户

发布于 2019-05-24 05:48:34

设置此变量

代码语言:javascript
运行
复制
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

与仅仅运行

代码语言:javascript
运行
复制
RUN . env/bin/activate

因为单个RUN中的激活不会影响Dockerfile中该RUN下面的任何行。但是通过ENV设置环境变量将激活所有RUN命令的虚拟环境。

请看下面的示例:

代码语言:javascript
运行
复制
RUN virtualenv env                       # setup env
RUN which python                         # -> /usr/bin/python
RUN . /env/bin/activate && which python  # -> /env/bin/python
RUN which python                         # -> /usr/bin/python

因此,如果您确实需要为整个Dockerfile激活virtualenv,则需要执行如下操作:

代码语言:javascript
运行
复制
RUN virtualenv env
ENV VIRTUAL_ENV /env                     # activating environment
ENV PATH /env/bin:$PATH                  # activating environment
RUN which python                         # -> /env/bin/python
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48561981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档