You need to enable JavaScript to run this app. Ubuntu16.04 Docker换Python3.6后代码仍用Python3.5问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu16.04 Docker换Python3.6后代码仍用Python3.5问题咨询

问题排查与修正

你遇到的Python版本不生效,根本不是操作顺序不对的问题,是几个操作从根上就用错了——跟你纠结的“update-alternatives放最后还是刚装完就配、alias什么时候写”完全没关系:

几个踩了大坑的操作

  • RUN alias python3='/usr/bin/python3.6' 放在Dockerfile任何位置都白写
    Docker每一层RUN都是启动一个全新的非交互shell跑命令,跑完进程直接销毁。alias是shell内部的临时状态,既不会持久化到系统配置,也不会被后续的RUN、容器启动的进程继承,这行从写出来开始就没生效过。
  • 你写的Python3.6路径从一开始就错了
    手动编译的Python3.6.7,默认装在/usr/local/bin/python3.6,根本不是你写的/usr/bin/python3.6。就算alias真能生效,你指向的也是个不存在的文件。
  • 之前的update-alternatives操作根本没碰到python3的实际指向
    你执行的update-alternatives --remove python /usr/bin/python3.5,只作用于python这个命令的备选组。但Ubuntu16.04里python3是独立的软链,默认直接钉死在系统自带的3.5上,根本不属于python这个alternatives组。你之前操作半天,python3的指向一点没动,代码调用的时候当然还是用3.5。

针对你最初两个疑问的直接回答

  • 完全没必要把update-alternatives放到Dockerfile最后。正确时机就是Python3.6装完、确认文件存在之后,立刻配alternatives——放到最后反而容易被后面的apt装包操作把软链冲掉。
  • 完全别指望用alias固定Python版本,刚装完就配还是最后配都没用。真要给shell加别名,得写到/etc/bash.bashrc或者对应用户的.bashrc里,在RUN里直接敲alias是完全没用的。

可以直接用的修正流程

  1. 编译完Python3.6先加个校验,别瞎猜路径:
    RUN ls -l /usr/local/bin/python3.6
    
  2. 紧接着装完就配alternatives,同时把python和python3两个命令的指向都切到3.6:
    RUN update-alternatives --remove python /usr/bin/python3.5 || true && \
        update-alternatives --remove python3 /usr/bin/python3.5 || true && \
        update-alternatives --install /usr/bin/python python /usr/local/bin/python3.6 100 && \
        update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.6 100
    
  3. 把那行没用的alias直接删掉,再往下走pip安装、环境变量配置、切非root用户的流程。装依赖的时候可以顺手打个python3 --version确认是3.6,避免包装到旧版本的目录里。

内容的提问来源于stack exchange,提问作者anastasiiia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 04:12:17