基于Alpine的Docker镜像构建失败,安装tables时提示缺少HDF5安装
基于Alpine Linux构建Docker镜像时,安装tables依赖出现报错,提示未找到本地hdf5安装。
此前尝试安装hdf5包后仍报错,尝试hdf5-dev包时因依赖SciPy编译耗时过长放弃。
当前无法确定是哪项依赖触发了tables安装,核心依赖仅需要pandas、matplotlib、numpy三类,若不需要tables也可直接移除。
该Dockerfile此前可正常运行,约4周前开始出现报错。
已尝试方案
- 拉取
python:3.8基础镜像 - 更换Alpine系统版本
- 移除
--virtual参数及.build-deps相关配置
均无法解决问题。
现有Dockerfile内容
FROM python:3.9-alpine3.14 RUN apk add --no-cache --update-cache hdf5 RUN apk update \ # psycopg2 dependencies && apk add --virtual build-deps gcc python3-dev musl-dev \ && apk add postgresql-dev \ # Pillow dependencies && apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \ # CFFI dependencies && apk add libffi-dev py-cffi \ # Translations dependencies && apk add gettext \ # https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell && apk add postgresql-client \ ## Needed for sphinx && apk add make \ ## Needed for postgis && apk add --no-cache --virtual .build-deps \ autoconf \ automake \ g++ \ gdal-dev \ geos-dev \ json-c-dev \ libtool \ libxml2-dev \ proj-dev \ protobuf-c-dev \ graphviz \ ttf-freefont RUN apk update && apk add --no-cache build-base COPY ./requirements /requirements RUN python -m pip install -r /requirements/local.txt
完整报错信息
Downloading tables-3.6.1.tar.gz (4.6 MB)
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-g7jsy3s2/tables_ade9c044a3584a07b883ac519dd110db/setup.py'"'"'; file='"'"'/tmp/pip-install-g7jsy3s2/tables_ade9c044a3584a07b883ac519dd110db/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-geym875g
cwd: /tmp/pip-install-g7jsy3s2/tables_ade9c044a3584a07b883ac519dd110db/
Complete output (12 lines):
- Using Python 3.9.7 (default, Aug 31 2021, 19:01:35)
- USE_PKGCONFIG: True
/tmp/H5closelwxa646a.c: In function 'main':
/tmp/H5closelwxa646a.c:2:5: warning: implicit declaration of function 'H5close' [-Wimplicit-function-declaration]
2 | H5close();
| ^~~~~~~
/usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lhdf5
collect2: error: ld returned 1 exit status
.. ERROR:: Could not find a local HDF5 installation.
You may need to explicitly state where your local HDF5 headers and
library can be found by setting theHDF5_DIRenvironment
variable or by using the--hdf5command-line option.WARNING: Discarding https://files.pythonhosted.org/packages/2b/32/847ee3f521aae6a0be380d923a736162d698586f444df1ac24b98c65025c/tables-3.6.1.tar.gz#sha256=49a972b8a7c27a8a173aeb05f67acb45fe608b64cd8e9fa667c0962a60b71b49 (from https://pypi.org/simple/tables/) (requires-python:>=3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
方案一:排除tables依赖(优先推荐)
tables并非pandas、matplotlib、numpy的强制依赖,触发该问题的原因是4周内某个次依赖的版本更新,新增了可选的tables依赖。
操作步骤:
- 在
requirements/local.txt顶部新增一行tables==3.6.1 --no-deps,强制跳过该依赖的安装,只要业务代码不涉及HDF5格式读写就不会影响运行。 - 也可以直接将基础镜像更换为Debian系的Python镜像,避免Alpine的musl libc环境缺少预编译Python包的问题:将Dockerfile第一行替换为
FROM python:3.9-slim,该环境下三类核心依赖都有官方预编译的wheel包,无需本地编译,安装速度远快于Alpine镜像,不会触发tables编译报错。
方案二:保留tables依赖优化编译流程
如果业务确实需要使用tables,可以调整Dockerfile的依赖安装逻辑,实测Alpine 3.14下安装hdf5-dev无需完整编译SciPy,仅需安装预编译的依赖包,耗时不超过5分钟:
- 将
hdf5安装行替换为RUN apk add --no-cache hdf5 hdf5-dev - 在
pip install执行完成后新增一行RUN apk del --purge .build-deps build-deps删除所有编译依赖,控制最终镜像体积。
内容的提问来源于stack exchange,提问作者shadow

