Docker如何将python 3.8设置为默认值

时间:2020-09-17 10:58:23

标签: python docker pip dockerfile python-3.8

我正在尝试更新现有的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,以从python3.8安装deadsnakes:ppa

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和{{1}在容器内安装依赖项}):

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

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

PS:我的Dockerfile镜像基于 Ubunut 18.04 ,默认情况下,该镜像随附python3.8

如何正确地将Dockerfile /映像从python3.6切换到python3.5?因此我以后可以直接使用python3.8,它指向pip的{​​{1}}

2 个答案:

答案 0 :(得分:2)

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

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

在您似乎正在使用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)

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

答案 1 :(得分:1)

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

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