我有一个 Dockerfile,我尝试在其中激活 python virtualenv,它应该在这个 env 中安装所有依赖项。但是,所有内容仍会在全局范围内安装。我使用了不同的方法,但没有一个有效。我也没有收到任何错误。哪里有问题?
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
是什么意思以及如何使用?
原文由 igsm 发布,翻译遵循 CC BY-SA 4.0 许可协议
您不需要在 Docker 容器中使用 virtualenv。
virtualenv 用于依赖隔离。您希望防止安装的任何依赖项或软件包在应用程序之间泄漏。 Docker 实现了同样的目标,它隔离了容器内的依赖关系,并防止容器之间和应用程序之间的泄漏。
因此,除非您在同一个容器中运行多个应用程序,否则在 Docker 容器中使用 virtualenv 是没有意义的,如果是这种情况,我会说您做错了什么,解决方案是将您的应用程序构建在一个更好的方法并将它们分成多个容器。
编辑 2022:鉴于这个答案获得了很多观点,我认为在 4 年后的现在添加这一点可能是有意义的,我意识到 Docker 映像中实际上存在虚拟环境的有效用法,尤其是在进行多阶段构建时:
In the
Dockerfile
example above, we are creating a virtualenv at/opt/venv
and activating it using anENV
statement, we then install all dependencies into this/opt/venv
并且可以简单地将这个文件夹复制到我们的runner
我们构建的阶段。这有助于最小化 docker 图像大小。