使用pymesh基础镜像构建的Streamlit应用Docker运行报ImportError
问题根因
该报错是因为PyMesh运行依赖GLIBCXX_3.4.26版本的动态链接库,而pymesh/pymesh基础镜像默认的系统源提供的libstdc++.so.6最高仅支持到GLIBCXX_3.4.25,同时如果你的requirements.txt中声明了pymesh依赖,会额外安装编译时依赖更高版本GLIBCXX的pymesh包,进一步加剧版本不兼容问题,直接执行apt-get install libstdc++6无法拉到符合要求的版本。
解决方案
按如下步骤修改即可解决:
- 检查你的
requirements.txt文件,删除其中的pymesh依赖声明,pymesh/pymesh基础镜像已经预装了适配自身系统环境的pymesh,无需重复安装。 - 替换原有Dockerfile,修改系统依赖安装逻辑,添加Ubuntu官方工具链PPA源升级libstdc++版本,修改后完整Dockerfile如下:
FROM pymesh/pymesh:latest WORKDIR /app COPY requirements.txt ./requirements.txt # 升级libstdc++6到支持GLIBCXX_3.4.26的版本 RUN apt-get update && \ apt-get install -y software-properties-common && \ add-apt-repository ppa:ubuntu-toolchain-r/test -y && \ apt-get update && \ apt-get upgrade -y libstdc++6 && \ # 清理缓存减小镜像体积 apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN pip install -r requirements.txt EXPOSE 8501 COPY . /app ENTRYPOINT ["streamlit", "run"] CMD ["dockerapp.py"]
- 重新执行镜像构建命令
docker build -t meshnetapp:latest .,构建完成后再用原启动命令启动容器即可正常运行。
可选验证步骤
如果需要确认依赖升级成功,可在镜像构建完成后执行以下命令查看符号是否存在:
docker run --rm --entrypoint bash meshnetapp:latest -c "strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.26"
有输出即代表libstdc++版本符合要求。
内容的提问来源于stack exchange,提问作者Aman Savaria
相关产品推荐
相关产品推荐

