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

Cal*_*laf 8 python pip python-venv dockerfile

在跑步的时候

$ 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.
Run Code Online (Sandbox Code Playgroud)

并考虑到最近偶尔出现的微妙之处与错误有关:

"/usr/bin/pip" "from pip import main" "ImportError: cannot import .."
Run Code Online (Sandbox Code Playgroud)

我宁愿屈服并确实升级。

所以我pip upgradeDockerFile, 中添加命令,venv 构建之后,因为pip重要的是 venv 中的那个(我做对了吗?)。所以我的 Dockerfile 现在有这个:

...
RUN python -m venv venv
RUN pip install --upgrade pip
...
Run Code Online (Sandbox Code Playgroud)

但是这样做并不能避免“您正在使用 pip 10.x”消息。我错过了什么?

更新

虽然是一个很有希望的建议,但

RUN source venv/bin/activate
RUN pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

也不

RUN source venv/bin/activate
RUN python -m pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 12

对此,最简单的答案是不要打扰 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 Code Online (Sandbox Code Playgroud)

如果你真的想要一个虚拟环境,你要么需要从虚拟环境的路径中专门运行包装器脚本

RUN python -m venv venv
RUN venv/bin/pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

或者在每个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 Code Online (Sandbox Code Playgroud)

尝试在它自己的 RUN 指令中激活虚拟环境除了生成一个无操作层之外没有任何作用。

# This step does nothing
RUN . venv/bin/activate
# And therefore this upgrades the system pip
RUN pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)