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

时间:2018-09-07 11:26:17

标签: python pip dockerfile python-venv

正在运行

  

$ 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 .."

我宁愿屈服并且确实要升级。

因此,我在venv建立之后的pip upgrade中添加了DockerFile命令, ,因为重要的pip是venv内部的一个(我说得对吗?)。所以我的Dockerfile现在有这个:

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

但是这样做不能避免出现“您正在使用pip 10.x”消息。我想念什么?

更新

尽管有希望的建议,但都没有

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

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

消除“您正在使用pip版本10.0.1,...”消息。

3 个答案:

答案 0 :(得分:2)

对此最简单的答案是不打扰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 reference对此进行了一些说明。)

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指令中激活虚拟环境,除了生成无操作层外,无济于事。

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

答案 1 :(得分:1)

在使用虚拟环境venv之前,您需要使用

激活它

在Windows上:

venv\Scripts\activate.bat

在Unix或MacOS上,运行:

source venv/bin/activate

请注意,venv是您环境的名称。您使用RUN python -m venv venv创建了此环境。我强烈建议使用其他名称。

然后您可以使用python -m pip install --upgrade pip

进行升级

答案 2 :(得分: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