在 Docker 容器内尝试使用 pip 安装 Shapely 时出现 OSError。

5

无法找到库geos_c或其任何变体的加载['libgeos_c.so.1', 'libgeos_c.so']

使用python:3.5.1镜像,我尝试运行一个包含在requirements.txt中安装shapely的容器。当docker容器尝试安装shapely时,我收到上述错误。

RUN apt-get install libgeos-dev

是我尝试搜索该问题时看到的内容,但返回无法定位软件包libgeos-dev。

总结:

预期条件:将shapely包含在requirements.txt文件中会导致在构建docker容器时安装shapely

实际情况:在构建过程中收到错误消息Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so']

重现步骤:

使用docker-compose构建

Docker-compose.yml:

app:
        build: ${APP_REPO}

Dockerfile:
FROM python:3.5.1-onbuild

Requirements.txt:

shapely

(简化以试图分离问题。)
3个回答

7

对于Alpine,只需运行以下Docker命令:

RUN apk add --no-cache \
gcc \
libc-dev \
geos-dev \
&& pip install shapely

这将安装具有地理和与shapely相关的C依赖关系的所有适当依赖项的Shapely,以供使用于alpine系统中。


2
这对我来说在 python:3-alpine docker 镜像中没有起作用。 - Alex G
适用于python:3.6-alpine。安装geos-dev可以解决在安装shapely时缺少的依赖项。这是正确的解决方案。 - Gil Hiram
不适用于 python:10-alpine,但对于 python:7-alpine 它可以正常工作,谢谢。 - Ibram Reda

3

我从这里找到了解决方案:https://github.com/calendar42/docker-python-geos/blob/master/Dockerfile

ENV PYTHONUNBUFFERED 1

#### Install GEOS ####
# Inspired by: https://hub.docker.com/r/cactusbone/postgres-postgis-sfcgal/~/dockerfile/

ENV GEOS http://download.osgeo.org/geos/geos-3.5.0.tar.bz2

#TODO make PROCESSOR_COUNT dynamic
#built by docker.io, so reducing to 1. increase to match build server processor count as needed
ENV PROCESSOR_COUNT 1

WORKDIR /install-postgis

WORKDIR /install-postgis/geos
ADD $GEOS /install-postgis/geos.tar.bz2
RUN tar xf /install-postgis/geos.tar.bz2 -C /install-postgis/geos --strip-components=1
RUN ./configure && make -j $PROCESSOR_COUNT && make install
RUN ldconfig
WORKDIR /install-postgis

在此行之前,我将其复制到了我的dockerfile中。

pip install requirements.txt

优美的安装程序已经运行成功。

有时在构建过程中会出现停顿,但主要问题已经解决。


这看起来是正确的,但我认为你也可以为该软件包构建一个 wheel 并安装它。 - dnephin
当我最初研究这个问题时,我发现有关wheel文件的信息表明它们是Windows特定的东西,这不是真的吗? - lathomas64
这完全不是真的。它们在Windows上更常见,因为对于Windows用户来说编译东西通常更难(他们并不总是有同样轻松的访问编译器),而且我相信pypi只包括Windows wheels。你可以在Linux和OSX上构建和使用wheels,但你必须为你的平台构建它们。 - dnephin

1
我曾经在我的Python应用程序中遇到了同样的问题。对我有用的是以下内容:
FROM python:3.8-slim-buster


WORKDIR /app

COPY requirements.txt requirements.txt

RUN apt-get update && apt-get install -y \
    libgeos-dev

RUN pip install -r requirements.txt

COPY . /app/

CMD ["python3", "app.py"]

目前你的回答不够清晰,请编辑并添加更多细节以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接