我正在尝试更新现有的Dockerfile,以从python3.5
切换到python3.8
,之前它正在为python3.5
和pip3
创建符号链接,如下所示:>
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}}
答案 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