如何在 Dockerfile 中的 venv 中升级 pip?

18

在运行时

$ sudo docker build -t myproj:tag .

我收到了以下信息:

You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

鉴于最近出现的偶尔细微错误表现:

"/usr/bin/pip" "from pip import main" "ImportError: cannot import .."

我宁愿妥协并升级。

因此,在构建虚拟环境后,我在DockerFile中添加了pip upgrade命令,因为重要的是虚拟环境内部的pip(我理解得对吗?)。所以我的Dockerfile现在是这样的:

...
RUN python -m venv venv
RUN pip install --upgrade pip
...

但这样做并不能避免出现“您正在使用 pip 10.x”的消息。我错过了什么吗?
更新:
虽然有一个很有前途的建议,但是也不行。
RUN source venv/bin/activate
RUN pip install --upgrade pip

nor

RUN source venv/bin/activate
RUN python -m pip install --upgrade pip

消除“您正在使用pip版本10.0.1,…”的提示信息。

你能分享更多的Dockerfile吗?比如更多的RUN或者CMD行? - Nils Werner
3个回答

29

最简单的答案是在Docker镜像中不要使用虚拟环境。虚拟环境提供了一个独立的文件系统空间和一组私有的Python包,避免与系统安装发生冲突,但是Docker镜像也可以实现这样的效果。您可以在Docker镜像中使用系统pip,这样就可以满足需求。

FROM python:3.7
RUN pip install --upgrade pip
WORKDIR /usr/src/app
COPY . .
RUN pip install .
CMD ["myscript"]

如果您真的想要一个虚拟环境,那么您需要从虚拟环境的路径明确运行包装脚本。

RUN python -m venv venv
RUN venv/bin/pip install --upgrade pip

或者在每个RUN命令中运行虚拟环境的“激活”脚本;它所设置的环境变量不会从一个步骤传递到另一个步骤。(实际上,每个RUN命令在内部执行自己的docker run; docker commit序列,并将在新容器中启动新的shell;Dockerfile参考文献对此进行了简单描述。)

RUN python -m venv venv
RUN . venv/bin/activate \
 && pip install --upgrade pip
COPY . .
RUN . venv/bin/activate \
 && pip install .
CMD ["venv/bin/myscript"]

在其自己的RUN指令中尝试激活虚拟环境除了生成一个no-op层外,什么都不会发生。

# This step does nothing
RUN . venv/bin/activate
# And therefore this upgrades the system pip
RUN pip install --upgrade pip

非常好,非常有說服力。除了您聽起來很有權威外,能否提供一些參考或某些理由,證明每個Dockerfile中的命令都會生成自己的shell,特別是進入虛擬環境將是暫時的?如果所有這些都融合在一起,最大的教訓就是不能在實際命令行上運行一組命令,然後將它們複製到Dockerfile中。 - Calaf
我添加了一个简短的部分,描述了RUN的实际作用。在Docker文档中,我找不到我正在寻找的确切措辞(它一直使用“层”),但至少提到RUN命令会在单独的shell中运行。 - David Maze

2

在使用虚拟环境venv之前,您需要激活它。

在Windows上:

venv\Scripts\activate.bat
venv\Scripts\activate.bat

在Unix或MacOS上运行:
source venv/bin/activate

请注意,venv是您的环境名称。您使用“RUN python -m venv venv”创建了此环境。我强烈建议使用其他名称。
然后,您可以使用“python -m pip install --upgrade pip”进行升级。

0

通过在Docker容器中创建虚拟环境之后

RUN python -m venv venv

然后运行其中任意一个

RUN venv/bin/pip install --upgrade pip

或者

RUN venv/bin/python -m pip install --upgrade pip

但是也不

RUN pip install --upgrade pip

或者

RUN python -m pip install --upgrade pip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接