在Dockerfile中激活python virtualenv

时间:2018-02-01 11:46:02

标签: python docker virtualenv dockerfile

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

1。 ENV PATH $PATH:env/bin

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

3。 RUN . env/bin/activate

我也跟着an example of a Dockerfile config for the python-runtime image on Google Cloud,这与上面的内容基本相同。

  

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

ENV VIRTUAL_ENV /env

ENV PATH /env/bin:$PATH

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

6 个答案:

答案 0 :(得分:14)

正如其他人所说,docker容器中的virtualenvs有点极端,但是仍然有合理的理由。

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

FROM python:2.7

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

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:8)

虽然我同意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"
...

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

答案 3 :(得分:0)

如果您使用的是python 3.x:

[7, 4, 7, 6, 5, 7, 7]

如果您使用的是python 2.x:

RUN pip install virtualenv
RUN virtualenv -p python3.5 virtual
RUN /bin/bash -c "source /virtual/bin/activate"

答案 4 :(得分:0)

设置此变量

ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

与刚刚运行并不完全相同

RUN . env/bin/activate

因为在单个RUN中的激活不会影响Dockerfile中RUN以下的任何行。但是通过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

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

RUN virtualenv env
ENV VIRTUAL_ENV /env                     # activating environment
ENV PATH /env/bin:$PATH                  # activating environment
RUN which python                         # -> /env/bin/python

答案 5 :(得分:0)

请考虑向pipenv的迁移-该工具将为您自动实现virtualenv和pip交互。 PyPA推荐。

通过pipenv在docker映像中复制环境非常简单:

FROM python:3.7

RUN pip install pipenv

COPY src/Pipfile* ./

RUN pipenv install --deploy

...