Docker 如何将 python 3.8 设为默认值

Aar*_*rif 11 python pip docker dockerfile python-3.8

我试图从更新现有Dockerfile来切换python3.5python3.8,以前有人创建符号链接python3.5pip3这样的:

RUN ln -s /usr/bin/pip3 /usr/bin/pip
RUN ln -s /usr/bin/python3 /usr/bin/python
Run Code Online (Sandbox Code Playgroud)

我已经更新了Dockerfile安装python3.8deadsnakes:ppa

apt-get install python3-pip python3.8-dev python3.8-distutils python3.8-venv
Run Code Online (Sandbox Code Playgroud)

如果我删除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
Run Code Online (Sandbox Code Playgroud)

它失败了,说

ln: 未能创建符号链接 '/usr/bin/python3': 文件存在

我认为失败是因为python3指向python3.6. 如果我尝试:RUN ln -s /usr/bin/python3.8 /usr/bin/python它不会抱怨符号链接和图像成功构建,但在稍后安装需求时失败(我们使用 Makefile 目标在容器内使用pipand安装依赖项pip-sync):

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

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

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

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

Ant*_*ile 7

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

更好的方法是创建一个前缀并将其放在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
Run Code Online (Sandbox Code Playgroud)

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

免责声明:我是死蛇的维护者


Dan*_*ues 5

为什么不直接从 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
Run Code Online (Sandbox Code Playgroud)