我正在用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高山映像。
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"]
docker-entrypoint
#!/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
答案 0 :(得分: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]
答案 1 :(得分:0)
我在安装Linux virtualenv时遇到了同样的问题,并且设法使用官方文档使其正常工作:
GDAL是出色的开源地理空间库,它支持读取大多数矢量和栅格空间数据格式。目前,GeoDjango仅支持GDAL的矢量数据功能[2]。在构建GDAL之前,应先安装GEOS和PROJ.4。
首先下载最新的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
答案 2 :(得分:0)
解决方案是将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"]