如何在Ubuntu18.04的Dockerfile中将默认python3设为Python3.8
问题根因
Dockerfile中每条RUN指令都会启动独立的非交互式shell子进程执行命令,alias的作用域仅限当前shell会话,进程退出后配置直接丢失;且非交互式shell默认不加载别名规则,哪怕把别名定义和版本查询写在同一条RUN里,别名也不会生效,因此查到的python3版本始终是系统默认的3.6.9。
另外别名仅对交互式终端生效,后续构建过程跑的脚本、容器启动时运行的服务进程都读不到别名配置,就算把别名写到.bashrc里也覆盖不了构建阶段的调用,根本不适合用来做镜像内的默认版本切换。
解决方案
用Ubuntu/Debian自带的update-alternatives工具管理软链接优先级,切换默认python3版本,这是系统层面的配置,对所有shell场景、构建进程、服务进程都生效,不会出现别名那种作用域失效的问题。
具体调整步骤:
- 先调整python3相关依赖的安装顺序:先装python3.8,再配置默认版本,最后装pip和所有python3依赖,避免包装到python3.6的路径下,导致python3.8环境找不到依赖。
- 把原Dockerfile里python3相关的配置段替换成下面的写法:
############## python3 packages ############### RUN apt-get update && \ # 安装python3.8及distutils依赖,避免后续pip安装报错 apt-get install -y python3.8 python3.8-distutils && \ # 注册python版本到alternatives管理,末尾数字为优先级,数值越高优先级越高 update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 && \ update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2 && \ # 验证版本,此处输出应为Python 3.8.x python3 --version && \ # 安装pip apt-get install -y python3-pip && \ # 批量安装所有需要的python3依赖 python3 -m pip install numpy pandas sqlalchemy boto3 pymysql pymongo pyfaidx
- 额外注意点:
- 如果配置完后pip调用仍指向3.6版本,可以通过官方get-pip.py引导脚本为python3.8安装匹配版本的pip即可
- 尽量把同类型的安装命令合并到同一个
RUN指令里,减少镜像层数,能有效缩小最终镜像体积 - 配置完成后不需要额外加别名或者环境变量,所有场景下调用
python3都会默认指向python3.8,包括后续构建过程和容器运行时
内容的提问来源于stack exchange,提问作者One thousand
相关产品推荐
相关产品推荐

