在Dockerfile中激活python virtualenv

igs*_*gsm 27 python virtualenv docker dockerfile

我有一个Dockerfile,我尝试激活python virtualenv之后,它应该在这个环境中安装所有依赖项.但是,一切仍然在全球范围内安装.我使用了不同的方法,但没有使用它们.我也没有任何错误.哪里有问题?

1. ENV PATH $PATH:env/bin

2. ENV PATH $PATH:env/bin/activate

3. RUN . env/bin/activate

我还在Google Cloud上关注了python-runtime图像的Dockerfile配置示例,这与上面的内容基本相同.

设置这些环境变量与运行source/env/bin/activate相同.

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

此外,ENV VIRTUAL_ENV /env它是什么意思和使用方式?

Mar*_*ind 20

您不需要在Docker容器中使用virtualenv.

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

因此,除非你在同一个容器中运行多个应用程序,否则在Docker容器中使用virtualenv是没有意义的,如果是这样的话,我会说你做错了什么,而解决方案就是在一个容器中构建你的应用程序.更好的方法,并将它们分成多个容器.

  • 对offtopic投反对票。如果作者关心 virtualenv 和 Docker 一起使用的具体问题,那意味着他实际上需要将 virtualenv 与 Docker 一起使用。 (12认同)
  • @GillBates这是一个假设(以及对此的永久争论)。显然,如果有人问如何将糖放入他们的油箱中,我们不会都说,看起来他们真的想知道如何将糖放入他们的油箱中。作者对 docker/venv 的无知是未知的,所以很难说出他们真正想要什么。也就是说,不同意容器中的 venv 没有任何意义。我的情况:基础镜像包与python安装冲突 (4认同)
  • 关键是节省空间。您可以按原样复制`virtualenv`目录,而无需在目标映像中使用python3-virtualenv。这样可以节省整个工具链(gcc和朋友),从而节省数百兆字节。 (3认同)
  • 许多Python软件包仅支持在虚拟环境中安装,在这种情况下,能够激活docker容器内的venv非常有用. (3认同)

Ell*_*val 19

正如其他人所说的那样,docker容器中的virtualenvs有点边缘,但仍有合理的理由.

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

FROM python:2.7

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

CMD ["/ve/bin/python", "yourcode.py"]
Run Code Online (Sandbox Code Playgroud)

  • 我认为,如果 yourcode.py 创建一个子进程,这将不起作用。您还需要摆弄 $PATH,如 Monitorius 的答案中所述。 (3认同)

mon*_*ius 12

设置这个变量

ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

并不完全等同于跑步

RUN . env/bin/activate
Run Code Online (Sandbox Code Playgroud)

因为在 single 中激活RUN不会影响RUNDockerfile 中低于该行的任何行。但是通过设置环境变量ENV将激活所有RUN命令的虚拟环境。

看这个例子:

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

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

RUN virtualenv env
ENV VIRTUAL_ENV /env                     # activating environment
ENV PATH /env/bin:$PATH                  # activating environment
RUN which python                         # -> /env/bin/python
Run Code Online (Sandbox Code Playgroud)

  • 当镜像已经构建和部署时,入口点在运行时执行。如果您想在运行时而不是映像构建时将软件包安装到 virtualenv,那么这应该是一个非常特殊的情况 (3认同)

pin*_*nty 11

虽然我同意Marcus认为这不是Docker的做法,但你可以做你想做的事.

直接使用Docker的RUN命令不会给你答案,因为它不会在虚拟环境中执行你的指令.而是使用/ bin/bash挤压在一行中执行的指令.以下Dockerfile为我工作:

FROM python:2.7

RUN virtualenv virtual
RUN /bin/bash -c "source /virtual/bin/activate && pip install pyserial && deactivate"
...
Run Code Online (Sandbox Code Playgroud)

这应该只在虚拟环境中安装pyserial模块.