Docker部署Python3 AWS Lambda函数报distutils.util模块缺失问题排查
问题核心原因
报错的根源是多阶段构建的运行阶段(最终镜像)缺失python3-distutils依赖,且存在Python版本不匹配问题,具体拆分:
- 仅在
build-image构建阶段安装了python3-distutils,这个包是系统级Python组件,不属于pip安装的用户依赖,不会被复制到最终运行镜像的${FUNCTION_DIR}目录下,而最终运行用的osgeo/gdal:ubuntu-small-latest镜像默认没有预装该依赖 - 构建阶段单独安装了Python3.6,但
osgeo/gdal:ubuntu-small-latest自带的Python版本大概率高于3.6,不同版本的Python模块互不兼容,也会引发导入失败 - 构建阶段用Python3.6的pip打包的依赖仅适配3.6版本,放到运行阶段高版本Python环境下也会出现兼容问题
注意:
distutils.util属于Python标准库的系统级组件,Ubuntu系统的精简镜像默认会裁剪该模块,必须通过apt安装python3-distutils才能使用,无法通过pip安装到自定义的依赖目录下。
修复方案
统一构建和运行阶段的Python版本,在最终运行镜像中补充安装系统级Python依赖,避免额外添加第三方Python源导致版本混乱,修复后Dockerfile如下:
ARG FUNCTION_DIR="/function" FROM osgeo/gdal:ubuntu-small-latest as build-image ARG FUNCTION_DIR RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev \ python3-pip \ python3-distutils RUN mkdir -p ${FUNCTION_DIR} COPY app/* ${FUNCTION_DIR} RUN python3 -m pip install --target ${FUNCTION_DIR} awslambdaric RUN python3 -m pip install --target ${FUNCTION_DIR} geopandas FROM osgeo/gdal:ubuntu-small-latest ARG FUNCTION_DIR WORKDIR ${FUNCTION_DIR} # 运行阶段安装必须的系统Python依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ python3-distutils \ python3-pip \ && rm -rf /var/lib/apt/lists/* COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} ENTRYPOINT [ "python3", "-m", "awslambdaric" ] CMD [ "app.handler" ]
如果需要固定Python版本,建议不要使用latest标签的GDAL镜像,选择绑定固定Ubuntu版本的镜像,版本可控性更高。
内容的提问来源于stack exchange,提问作者mik1971
相关产品推荐
相关产品推荐

