在Google Cloud Cloud Build的Python 3.10.8 Docker镜像中安装GDAL失败求助
在Google Cloud Build中基于Python 3.10.8镜像安装GDAL失败问题
我正尝试在Google Cloud的Cloud Build环境中,基于Python 3.10.8的Docker镜像安装GDAL,但目前未找到可行方案。尝试了多种网上的方法后,始终出现如下错误:
Step #0: Step 5/9 : ENV PATH $PATH:/usr/bin Step #0: ---> Running in 7b48f619d4a1 Step #0: Removing intermediate container 7b48f619d4a1 Step #0: ---> b4313bd792ac Step #0: Step 6/9 : ENV PATH $PATH:/usr/share/lintian/overrides/gdal-bin Step #0: ---> Running in 1745e30e8a86 Step #0: Removing intermediate container 1745e30e8a86 Step #0: ---> 1f7ec2e34cd8 Step #0: Step 7/9 : ARG CPLUS_INCLUDE_PATH=/usr/include/gdal Step #0: ---> Running in 4d3ccf1e9efa Step #0: Removing intermediate container 4d3ccf1e9efa Step #0: ---> 787d1acef1f3 Step #0: Step 8/9 : ARG C_INCLUDE_PATH=/usr/include/gdal Step #0: ---> Running in 00340d417631 Step #0: Removing intermediate container 00340d417631 Step #0: ---> 1922c706cabe Step #0: Step 9/9 : RUN pip install GDAL Step #0: ---> Running in 71a5e16d25d4 Step #0: Collecting GDAL Step #0: Downloading GDAL-3.7.0.tar.gz (775 kB) Step #0: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 775.5/775.5 kB 40.0 MB/s eta 0:00:00 Step #0: Preparing metadata (setup.py): started Step #0: Preparing metadata (setup.py): finished with status 'error' Step #0: error: subprocess-exited-with-error Step #0: Step #0: × python setup.py egg_info did not run successfully. Step #0: │ exit code: 1 Step #0: ╰─> [84 lines of output] Step #0: WARNING: numpy not available! Array support will not be enabled Step #0: running egg_info Step #0: creating /tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info Step #0: writing /tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info/PKG-INFO Step #0: writing dependency_links to /tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info/dependency_links.txt Step #0: writing requirements to /tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info/requires.txt Step #0: writing top-level names to /tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info/top_level.txt Step #0: writing manifest file '/tmp/pip-pip-egg-info-5k_eohyx/GDAL.egg-info/SOURCES.txt' Step #0: Traceback (most recent call last): Step #0: File "/tmp/pip-install-2kmkdthm/gdal_7fd12a6a1cfc4f828e9ac25e1118c961/setup.py", line 87, in fetch_config Step #0: p = subprocess.Popen([command, args], stdout=subprocess.PIPE) Step #0: File "/usr/local/lib/python3.10/subprocess.py", line 971, in __init__ Step #0: self._execute_child(args, executable, preexec_fn, close_fds, Step #0: File "/usr/local/lib/python3.10/subprocess.py", line 1847, in _execute_child Step #0: raise child_exception_type(errno_num, err_msg, err_filename) Step #0: NotADirectoryError: [Errno 20] Not a directory: 'gdal-config'
我使用的Dockerfile内容如下:
FROM python:3.10.8-buster #update pip RUN pip install --upgrade pip RUN apt-get update &&\ apt-get install -y binutils libproj-dev gdal-bin ENV PATH $PATH:/usr/bin ENV PATH $PATH:/usr/share/lintian/overrides/gdal-bin ARG CPLUS_INCLUDE_PATH=/usr/include/gdal ARG C_INCLUDE_PATH=/usr/include/gdal RUN pip install GDAL
我自行尝试设置PATH变量但未成功。能否有人指明方向?我是否需要正确设置某些变量,或是需要额外安装组件?为何一直提示找不到gdal-config?它不应该找gdal-bin吗?
问题原因
- 缺少GDAL开发库:仅安装
gdal-bin(GDAL二进制工具)不够,Python GDAL包编译需要libgdal-dev,这个包才包含gdal-config工具。 - PATH配置错误:
/usr/share/lintian/overrides/gdal-bin不是gdal-config的路径,gdal-config实际在/usr/bin,而默认PATH已包含该目录,额外添加的PATH无效甚至干扰。 - 变量作用域错误:用
ARG定义的路径变量仅在Dockerfile构建指令阶段生效,pip install运行时需要的是环境变量,必须用ENV。 - 缺少numpy依赖:日志提示numpy未安装,虽为可选依赖,但提前安装可确保GDAL完整功能并消除警告。
修正后的Dockerfile
FROM python:3.10.8-buster # 更新pip RUN pip install --upgrade pip # 安装GDAL完整依赖,清理apt缓存减小镜像体积 RUN apt-get update && \ apt-get install -y --no-install-recommends \ binutils \ libproj-dev \ gdal-bin \ libgdal-dev && \ rm -rf /var/lib/apt/lists/* # 设置环境变量,让pip获取GDAL编译参数 ENV CPLUS_INCLUDE_PATH=/usr/include/gdal ENV C_INCLUDE_PATH=/usr/include/gdal # 提前安装numpy RUN pip install numpy # 安装与系统GDAL版本匹配的Python包,避免版本冲突 RUN pip install GDAL==$(gdal-config --version)
关键说明
- 安装libgdal-dev:这是解决
gdal-config找不到问题的核心,只有这个包提供编译Python GDAL所需的配置工具和头文件。 - 版本匹配:用
gdal-config --version获取系统安装的GDAL版本,让pip安装对应版本的Python包,避免版本不兼容导致的编译失败。 - 环境变量替换ARG:
ENV定义的变量会在容器运行时生效,确保pip安装过程中能读取到GDAL的头文件路径。 - 清理缓存:添加
rm -rf /var/lib/apt/lists/*是Docker最佳实践,可大幅减小镜像体积。
内容的提问来源于stack exchange,提问作者Aleksander Lipka
相关产品推荐
相关产品推荐

