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是没有意义的,如果是这样的话,我会说你做错了什么,而解决方案就是在一个容器中构建你的应用程序.更好的方法,并将它们分成多个容器.
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)
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)
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模块.
| 归档时间: |
|
| 查看次数: |
17389 次 |
| 最近记录: |