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是完全没用的。
可以直接用的修正流程
- 编译完Python3.6先加个校验,别瞎猜路径:
RUN ls -l /usr/local/bin/python3.6 - 紧接着装完就配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 - 把那行没用的alias直接删掉,再往下走pip安装、环境变量配置、切非root用户的流程。装依赖的时候可以顺手打个
python3 --version确认是3.6,避免包装到旧版本的目录里。
内容的提问来源于stack exchange,提问作者anastasiiia
相关产品推荐
相关产品推荐

