【问题标题】:GeoDjango can't find gdal on docker python alpine based imageGeoDjango 在基于 docker python alpine 的图像上找不到 gdal
【发布时间】:2020-02-12 15:16:56
【问题描述】:

我正在使用 gdal 创建一个 geodjango 容器(基于 Python alpine 官方图像)。启动容器时,出现以下错误:

>>> from django.contrib.gis import gdal
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/li...
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal", "GDAL", "gdal2.3.0", "gdal2.2.0", "gdal2.1.0", "gdal2.0.0", "gdal1.11.0"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.

我的图片包含以下 gdal 库:

# find / -name libgdal*
/usr/lib/libgdal.so.20
/usr/lib/libgdal.so.20.5.0
/usr/lib/libgdal.a
/usr/lib/libgdal.so

在我的 django 设置中添加 GDAL_LIBRARY_PATH='usr/lib/libgdal.so.20' 并没有解决这个问题。

我的 Dockerfile,基于官方 python3 alpine 镜像。

FROM python:alpine

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

WORKDIR /usr/src/dbchiro

COPY requirements.txt /usr/src/dbchiro

# GeoDjango Dependencies

RUN  echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" > /etc/apk/repositories \
     && echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
     && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories  \
     && apk add --virtual .build-deps zlib-dev jpeg-dev gdal-dev musl-dev postgresql-dev\
      alpine-sdk libffi-dev jpeg-dev python-dev zlib-dev libffi gcc \ 
     && apk add --no-cache postgresql-libs geos gdal postgresql-client libpq proj nginx \ 
     && python3 -m pip install --upgrade pip --no-cache-dir \
     && python3 -m pip install -r requirements.txt --no-cache-dir \
     && python3 -m pip install gunicorn --no-cache-dir \
     && apk --purge del .build-deps


COPY docker-entrypoint.sh /usr/bin/docker-entrypoint.sh

COPY . /usr/src/dbchiro

VOLUME ["/app","/app/media"]

WORKDIR /app

EXPOSE 80

ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]

CMD ["/bin/sh"]

码头入口点

#!/bin/sh

export DBHOST=${DBHOST:-db}
...

shopt -s dotglob nullglob
mv /usr/src/dbchiro/* /app/

ls /app

cp -a /app/dbchiro/settings/configuration/config.py.sample /app/dbchiro/settings/configuration/config.py

sed -i "s/dbHost/${DBHOST}/g" /app/dbchiro/settings/configuration/config.py
...

until pg_isready -h $DBHOST -p $DBPORT
do
  echo "Awaiting Database container"
  sleep 1
done
sleep 2

cd /app

export DJANGO_SETTINGS_MODULE=dbchiro.settings.$SETTINGS

python -m manage makemigrations  accounts core blog dicts geodata management sights
python -m manage migrate  
python -m manage collectstatic --noinput 

cp /app/static/img/logo_site.png.sample /app/static/img/logo_site.png

#nginx Conf

cp /app/dbchiro/settings/configuration/nginx_dbchiro.conf.sample /etc/nginx/conf.d/dbchiro.conf
rm /etc/nginx/sites-enabled/*
sed -i "s/pathToApp/app/g" /etc/nginx/conf.d/dbchiro.conf
/etc/init.d/nginx restart

gunicorn -b 127.0.0.1:8000 dbchiro.wsgi

要求

arrow==0.15.2
backports.csv==1.0.7
colorlog==4.0.2
defusedxml==0.6.0
Django==2.2.5
django-autocomplete-light==3.4.1
django-ckeditor==5.7.1
django-crispy-forms==1.7.2
django-debug-toolbar==2.0
django-extensions==2.2.1
django-filter==2.2.0
django-geojson==2.12.0
django-js-asset==1.2.2
django-leaflet==0.24.0
django-nested-admin==3.2.4
django-tables2==2.1.1
et-xmlfile==1.0.1
jdcal==1.4.1
odfpy==1.4.0
openpyxl==3.0.0
Pillow==6.1.0
psycopg2-binary==2.8.3
python-dateutil==2.8.0
python-monkey-business==1.0.0
pytz==2019.2
PyYAML==5.1.2
six==1.12.0
sqlparse==0.3.0
tablib==0.13.0
xlrd==1.2.0
xlwt==1.3.0

请帮忙,完整的项目在这里 https://framagit.org/fred.perso/dbchiroweb/tree/docker

【问题讨论】:

  • 试试GDAL_LIBRARY_PATH='usr/lib/libgdal.so'而不是GDAL_LIBRARY_PATH='usr/lib/libgdal.so.20'
  • 谢谢,添加alpine-sdk(构建基本等效项)解决了我的问题,但图像要大得多(256Mb 的包而不是 69Mb)。我需要找到该元包安装的哪个包是解决方案。

标签: django dockerfile gdal geodjango alpine


【解决方案1】:

我也为此苦苦挣扎了一段时间,最终的解决方案证明非常简单(我使用的是 MySql,所以依赖项更少):

在Dockerfile中正常安装依赖,例如:

RUN apk add --no-cache geos gdal 

然后使用 glob 在 Django 设置中设置它们各自的变量,例如:

from glob import glob

GDAL_LIBRARY_PATH=glob('/usr/lib/libgdal.so.*')[0]
GEOS_LIBRARY_PATH=glob('/usr/lib/libgeos_c.so.*')[0]

【讨论】:

    【解决方案2】:

    解决方案是将 binutils 添加到永久安装的软件包中。这是我最后的Dockerfile

    FROM python:alpine
    
    ENV PYTHONUNBUFFERED 1
    ENV PYTHONDONTWRITEBYTECODE 1
    
    WORKDIR /usr/src/dbchiro
    
    COPY requirements.txt /usr/src/dbchiro
    
    RUN apk add --no-cache \
                --upgrade \
                --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
            postgresql-client \
            libpq \
            nginx\
        && apk add --no-cache \
                   --upgrade \
                   --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
                   --virtual .build-deps \
            postgresql-dev \
            zlib-dev jpeg-dev \ 
            alpine-sdk \
        && apk add --no-cache \
                   --upgrade \
                   --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \
            geos \
            proj \
            gdal \
            binutils \
        && ln -s /usr/lib/libproj.so.15 /usr/lib/libproj.so \
        && ln -s /usr/lib/libgdal.so.20 /usr/lib/libgdal.so \
        && ln -s /usr/lib/libgeos_c.so.1 /usr/lib/libgeos_c.so \
        && mkdir /var/run/nginx
    
    COPY requirements.txt /usr/src/dbchiro
    
    RUN  python3 -m pip install --upgrade pip --no-cache-dir \
         && python3 -m pip install -r requirements.txt --no-cache-dir \
         && python3 -m pip install gunicorn --no-cache-dir \ 
         && apk --purge del .build-deps
    
    COPY docker-entrypoint.sh /usr/bin/docker-entrypoint.sh
    
    COPY . /usr/src/dbchiro
    
    VOLUME ["/dbchiro"]
    
    WORKDIR /app
    
    EXPOSE 80
    
    ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
    

    【讨论】:

      【解决方案3】:

      我在安装我的 Linux virtualenv 时遇到了同样的问题,我设法使用官方文档让它工作:

      GDAL 是一个优秀的开源地理空间库,支持读取大多数矢量和栅格空间数据格式。目前,GeoDjango 仅支持 GDAL 的矢量数据能力[2]。 GEOS 和 PROJ.4 应该在构建 GDAL 之前安装。 首先下载最新的 GDAL 发布版本并解压存档: wget https://download.osgeo.org/gdal/X.Y.Z/gdal-X.Y.Z.tar.gz tar xzf gdal-X.Y.Z.tar.gz cd gdal-X.Y.Z

      配置、制作和安装: ./configure make # Go get some coffee, this takes a while. sudo make install cd ..

      更多细节可以参考 Django 文档:Django Documentation

      【讨论】:

      • 在 docker 中不是很有用,希望你觉得这不是冒犯性的,让它在 docker 之外工作并不是那么麻烦
      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 2021-12-14
      • 2022-11-11
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多