I’m trying to update an existing Dockerfile to switch from python3.5
to python3.8
, previously it was creating a symlink for python3.5
and pip3
像这样:
RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN ln -s /usr/bin/python3 /usr/bin/python
我已经更新了 Dockerfile 以从 deadsnakes:ppa
安装 python3.8
apt-get install python3-pip python3.8-dev python3.8-distutils python3.8-venv
如果我删除 python3-pip
,它会抱怨 gcc
此系统上未安装 C 编译器或 Python 头文件。尝试运行:sudo apt-get install gcc python3-dev
有了这些安装,我正在尝试更新现有的符号链接创建,如下所示:
RUN ln -s /usr/bin/pip3 /usr/local/lib/python3.8/dist-packages/pip
RUN ln -s /usr/bin/pip /usr/local/lib/python3.8/dist-packages/pip
RUN ln -s /usr/bin/python3.8 /usr/bin/python3
它失败了,说
ln: 未能创建符号链接 ‘/usr/bin/python3’: 文件存在
我认为失败是因为 python3
指向 python3.6
。如果我尝试: RUN ln -s /usr/bin/python3.8 /usr/bin/python
它不会抱怨符号链接和图像成功构建,但在稍后安装需求时失败(我们使用 Makefile 目标在容器内安装依赖项使用 pip
和 pip-sync
):
错误:无法卸载“python-apt”。这是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载。
我认为这是因为 python-apt
作为默认安装的一部分 python3.6
安装和 python3.8
pip 无法卸载它。
PS:我的 Dockerfile 镜像基于默认带有 python3.6
的 Ubunut 18.04 。
如何正确地将 Dockerfile/image 从 python3.5
切换到 python3.8
?所以我以后可以直接使用 pip
它指向 python3.8
的 pip
原文由 Aarif 发布,翻译遵循 CC BY-SA 4.0 许可协议
以这种方式替换系统 python 通常不是一个好主意(因为它可以破坏依赖于那些可执行文件的操作系统级程序)——我在 我制作的“为什么不使用全局 pip /虚拟环境?”
更好的方法是创建一个前缀并将其放在
PATH
之前(这允许系统可执行文件继续工作,但裸露python
/python3
/ etc . 将使用您的其他可执行文件)在你使用的 deadsnakes 的情况下,这样的事情应该有效:
ENV
行是这里的关键,它将 virtualenv 放在路径的开头免责声明:我是 deadsnakes 的维护者