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

新手上路,请多包涵

在跑步的时候

$ 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 2e这个权利?)。所以我的 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,…”消息。

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

阅读 1.3k
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 参考 对此有一点描述。)

 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

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

在你可以使用你的虚拟环境之前 venv 你需要激活它

在 Windows 上:

 venv\Scripts\activate.bat

在 Unix 或 MacOS 上,运行:

 source venv/bin/activate

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

然后你可以升级 python -m pip install --upgrade pip

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

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