【问题标题】:Docker how to make python 3.8 as defaultDocker如何将python 3.8设为默认
【发布时间】:2021-01-04 06:15:56
【问题描述】:

我正在尝试更新现有的 Dockerfile 以从 python3.5 切换到 python3.8,之前它正在为 python3.5pip3 创建符号链接,如下所示:

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 镜像基于 Ubunut 18.04,默认带有 python3.6

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

【问题讨论】:

    标签: python docker pip dockerfile python-3.8


    【解决方案1】:

    为什么不使用所需的配置从 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
    

    【讨论】:

    • 我实际上正在执行所有这些步骤,我已经跳过了添加deadsnakes:ppa 以保持问题简短的那些行,让我试试这个
    • 它成功构建了映像,但正如我所说,稍后涉及一个步骤,我们使用 Makefile 目标使用 pippip-sync 在容器内安装依赖项,但无法卸载 'python -apt'。
    • 请不要为apt update 单独运行,这会创建一个新层,该层将存储在缓存中,在某些情况下可能会导致您尝试安装时找不到包稍后。
    【解决方案2】:

    以这种方式替换系统 python 通常不是一个好主意(因为它可能会破坏依赖于这些可执行文件的操作系统级程序)——我在 this video I made "why not global pip / virtualenv?" 中稍微介绍了这一点

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

    对于您似乎正在使用的死蛇,这样的事情应该可以工作:

    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 的贡献,最初,我正在寻找一个不涉及virtualenv 但安装了python3.8 的解决方案想要修补在系统级别安装的软件包,它没有'不喜欢……长话短说,结合virtualenv是最好的选择……再次感谢!
    猜你喜欢
    • 2020-11-22
    • 2022-08-03
    • 2021-01-18
    • 2020-11-19
    • 2014-08-29
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多