Docker如何将python 3.8设为默认

新手上路,请多包涵

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 目标在容器内安装依赖项使用 pippip-sync ):

错误:无法卸载“python-apt”。这是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载。

我认为这是因为 python-apt 作为默认安装的一部分 python3.6 安装和 python3.8 pip 无法卸载它。

PS:我的 Dockerfile 镜像基于默认带有 python3.6Ubunut 18.04

如何正确地将 Dockerfile/image 从 python3.5 切换到 python3.8 ?所以我以后可以直接使用 pip 它指向 python3.8pip

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

阅读 929
2 个回答

以这种方式替换系统 python 通常不是一个好主意(因为它可以破坏依赖于那些可执行文件的操作系统级程序)——我在 我制作的“为什么不使用全局 pip /虚拟环境?”

更好的方法是创建一个前缀并将其放在 PATH 之前(这允许系统可执行文件继续工作,但裸露 python / python3 / etc . 将使用您的其他可执行文件)

在你使用的 deadsnakes 的情况下,这样的事情应该有效:

 FROM ubuntu:bionic

RUN : \
    && apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        software-properties-common \
    && add-apt-repository -y ppa:deadsnakes \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        python3.8-venv \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && :

RUN python3.8 -m venv /venv
ENV PATH=/venv/bin:$PATH

ENV 行是这里的关键,它将 virtualenv 放在路径的开头

$ docker build -t test .
...
$ docker run --rm -ti test bash -c 'which python && python --version && which pip && pip --version'
/venv/bin/python
Python 3.8.5
/venv/bin/pip
pip 20.1.1 from /venv/lib/python3.8/site-packages/pip (python 3.8)


免责声明:我是 deadsnakes 的维护者

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

为什么不使用所需的配置从 ubuntu:18.04 构建一个新图像?像这样:

 FROM ubuntu:18.04
RUN apt update && apt install software-properties-common -y
RUN add-apt-repository ppa:deadsnakes/ppa && install python3.8 -y
RUN ln -s /usr/bin/pip3 /usr/bin/pip && \
    ln -s /usr/bin/python3.8 /usr/bin/python

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

推荐问题