基于Ubuntu18.04的Docker镜像默认Python3.6,如何仅保留Python3.7?
解决Docker镜像中Python 3.7默认版本问题
我来帮你搞定这个Ubuntu 18.04 Docker镜像里Python版本的坑~你遇到的问题主要有两个原因:一是RUN alias只在当前shell进程生效,容器启动后不会继承;二是系统默认的pip3还是绑定Python 3.6,导致依赖装错了位置。下面是修改后的Dockerfile和详细说明:
修改后的Dockerfile
FROM ubuntu:18.04 # 配置字符编码,避免中文乱码或编码相关报错 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 # 安装Python3.7并清理旧版本 RUN apt-get update && apt-get install -y --no-install-recommends \ python3.7 \ python3.7-dev \ python3.7-distutils \ && apt-get purge -y python3.6 python3.6-dev \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* # 将Python3.7设置为系统默认的python/python3 RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1 \ && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 \ # 升级pip到最新版本,确保绑定Python3.7 && python3 -m pip install --upgrade pip setuptools # 设置规范的工作目录 WORKDIR /app # 优先拷贝requirements.txt,利用Docker构建缓存优化 COPY requirements.txt . # 使用绑定Python3.7的pip安装依赖 RUN pip install -r requirements.txt # 拷贝你的应用代码(如果需要的话,取消注释下面一行) # COPY . .
关键改动说明
- 彻底移除Python3.6:通过
apt-get purge卸载系统自带的Python3.6及其开发包,再用autoremove清理残留依赖,从根源避免版本冲突。 - 系统层面设置默认版本:用
update-alternatives工具将python和python3命令指向Python3.7,这是系统级的配置,无论哪个shell进程都会生效,比alias靠谱得多。 - 绑定Python3.7的pip:用
python3 -m pip来升级pip,确保pip属于Python3.7环境,之后安装的依赖包会直接存到Python3.7的site-packages目录,解决手动运行Python3.7找不到模块的问题。 - 优化构建缓存:先拷贝
requirements.txt再安装依赖,只有当requirements.txt内容变化时,Docker才会重新执行依赖安装步骤,大幅加快重复构建的速度。
验证方法
构建镜像后,运行容器执行以下命令确认版本:
python --version # 应输出Python 3.7.x pip --version # 应显示关联到Python 3.7
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

