我有一个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
的意思是什么以及如何使用它?
答案 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)