在 Dockerfile 中激活 python virtualenv

新手上路,请多包涵

我有一个 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 许可协议

阅读 2k
1 个回答

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

virtualenv 用于依赖隔离。您希望防止安装的任何依赖项或软件包在应用程序之间泄漏。 Docker 实现了同样的目标,它隔离了容器内的依赖关系,并防止容器之间和应用程序之间的泄漏。

因此,除非您在同一个容器中运行多个应用程序,否则在 Docker 容器中使用 virtualenv 是没有意义的,如果是这种情况,我会说您做错了什么,解决方案是将您的应用程序构建在一个更好的方法并将它们分成多个容器。


编辑 2022:鉴于这个答案获得了很多观点,我认为在 4 年后的现在添加这一点可能是有意义的,我意识到 Docker 映像中实际上存在虚拟环境的有效用法,尤其是在进行多阶段构建时:

 FROM python:3.9-slim as compiler
ENV PYTHONUNBUFFERED 1

WORKDIR /app/

RUN python -m venv /opt/venv
# Enable venv
ENV PATH="/opt/venv/bin:$PATH"

COPY ./requirements.txt /app/requirements.txt
RUN pip install -Ur requirements.txt

FROM python:3.9-slim as runner
WORKDIR /app/
COPY --from=compiler /opt/venv /opt/venv

# Enable venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . /app/
CMD ["python", "app.py", ]

In the Dockerfile example above, we are creating a virtualenv at /opt/venv and activating it using an ENV statement, we then install all dependencies into this /opt/venv 并且可以简单地将这个文件夹复制到我们的 runner 我们构建的阶段。这有助于最小化 docker 图像大小。

原文由 Marcus Lind 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题