作者:超可爱萌地1983 | 来源:互联网 | 2022-12-30 09:21
我有一个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
它是什么意思和使用方式?
1> Marcus Lind..:
您不需要在Docker容器中使用virtualenv.
virtualenv用于依赖性隔离.您希望防止安装的任何依赖项或软件包在应用程序之间泄漏.Docker实现了同样的功能,它隔离了容器中的依赖项,并防止容器之间和应用程序之间的泄漏.
因此,除非你在同一个容器中运行多个应用程序,否则在Docker容器中使用virtualenv是没有意义的,如果是这样的话,我会说你做错了什么,而解决方案就是在一个容器中构建你的应用程序.更好的方法,并将它们分成多个容器.
关键是节省空间。您可以按原样复制`virtualenv`目录,而无需在目标映像中使用python3-virtualenv。这样可以节省整个工具链(gcc和朋友),从而节省数百兆字节。
许多Python软件包仅支持在虚拟环境中安装,在这种情况下,能够激活docker容器内的venv非常有用.
2> Ellis Perciv..:
正如其他人所说的那样,docker容器中的virtualenvs有点边缘,但仍有合理的理由.
您不一定需要激活virtualenv来安装软件或使用它.尝试直接从virtualenv的bin
目录调用可执行文件:
FROM python:2.7
RUN virtualenv /ve
RUN /ve/bin/pip install somepackage
CMD ["/ve/bin/python", "yourcode.py"]
3> pinty..:
虽然我同意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模块.