So funktioniert GDAL mit Google GCLOUD

So funktioniert GDAL mit Google GCLOUD

Beim Versuch, meine App in der GCloud App Engine bereitzustellen, wird der folgende Fehler angezeigt. Das Problem entsteht beim Versuch, die GDAL-Bibliothek zu meiner App hinzuzufügen.

Datei „/opt/python3.7/lib/python3.7/ctypes/init.py“, Zeile 377, in getattr func = self.getitem(name) Datei „/opt/python3.7/lib/python3.7/ctypes/init.py“, Zeile 382, ​​in getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: undefiniertes Symbol: OGR_F_GetFieldAsInteger64

Ich habe alle Anweisungen befolgt, die ich online finden konnte. Aber nichts scheint zu funktionieren. Hier sind meine app.yml-Dateien:

runtime: custom

entrypoint: gunicorn -b :8080 app.wsgi
env: flex 

# any environment variables you want to pass to your application.
# accessible through os.environ['VARIABLE_NAME']
env_variables:
 ... 
  
beta_settings:
  cloud_sql_instances: site:asia-northeast2:site-db

handlers:
- url: /.*
  script: auto
  secure: always
manual_scaling: 
  instances: 1

runtime_config:
  python_version: 3 

Und Dockerfile:

FROM gcr.io/google-appengine/python
#FROM python:3.7
#FROM python:3.8.0-slim-buster

EXPOSE 8080
ENV PYTHONUNBUFFERED 1

# Install GDAL dependencies
#RUN apt-get update && apt-get install --yes libgdal-dev
RUN apt-get update && apt-get install --reinstall -y \
  #libopenjp2-7 \
  #libopenjp2-7-dev \
  #libgdal-dev \
  binutils \
  gdal-bin \
  python-gdal \
  python3-gdal 


# Update C env vars so compiler can find gdal
#ENV CPLUS_INCLUDE_PATH=/usr/include/gdal
#ENV C_INCLUDE_PATH=/usr/include/gdal
RUN export CPLUS_INCLUDE_PATH=/usr/include/gdal
RUN export C_INCLUDE_PATH=/usr/include/gdal

# Create a virtualenv for dependencies. This isolates these packages from
# system-level packages.
# Use -p python3 or -p python3.7 to select python version. Default is version 2.
RUN virtualenv /env -p python3

# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Copy the application's requirements.txt and run pip to install all
# dependencies into the virtualenv.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
# Add the application source code.
ADD . /app

# Run a WSGI server to serve the application. gunicorn must be declared as
# a dependency in requirements.txt.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app --timeout 0 --preload

Aktualisieren: Wie die meisten Online-Vorschläge zur Verwendung des Python3.8-Images.

FROM python:3.8

Wenn ich das versuche, erhalte ich die folgende Fehlermeldung:

/bin/sh: 1: virtualenv: nicht gefunden. Der Befehl „/bin/sh -c virtualenv /env -p python3“ hat einen Code ungleich Null zurückgegeben: 127. FEHLER. FEHLER: Build-Schritt 0 „gcr.io/cloud-builders/docker“ ist fehlgeschlagen: Schritt wurde mit einem Status ungleich Null beendet: 127.

Kann mir hier jemand helfen? Was muss ich tun, damit das funktioniert?

Antwort1

GDAL-Abhängigkeiten mit GAE können ziemlich nervig sein. Außerdem ist mir aufgefallen, dass das für die Flex-Umgebung veröffentlichte GAE-Image kein Python3.8 enthält, im Gegensatz zur Standardumgebung, die 3.8 enthalten soll (es geht bis zu Python3.7 für Flex, Sie können sie alle in sehen /opt/python3.*). Sie sollten also 3.8 selbst installieren, plus ein paar notwendige GIS-Abhängigkeiten.

Probieren Sie dieses Dockerfile aus:

FROM gcr.io/google-appengine/python
ENV PYTHONUNBUFFERED 1
ENV DEBIAN_FRONTEND noninteractive

RUN apt -y update && apt -y upgrade\
    && apt-get install -y software-properties-common \
    && add-apt-repository -y ppa:ubuntugis/ppa \
    && add-apt-repository -y ppa:deadsnakes/ppa \
    && apt -y update && apt -y upgrade\
    && apt-get -y install python3.8 python3.8-distutils python3.8-venv \
       gdal-bin libgdal-dev python3-gdal  \ 
    && apt-get autoremove -y \
    && apt-get autoclean -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN virtualenv /env -p python3.8
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

ADD requirements.txt /app/requirements.txt
RUN python3 -m pip install -r /app/requirements.txt 
ADD . /app/
WORKDIR /app
CMD gunicorn -b :$PORT app.wsgi

Dabei wird das Deadsnakes PPA verwendet, um die Python3.8-Binärdatei und Co. im Container zu installieren, sowie die neueren GDAL/GIS-Abhängigkeiten, da der GAE-Container auf Ubuntu 16.04 LTS (xenial) basiert, das mit einigen ziemlich veralteten Paketen geliefert wird. Beachten Sie, dass Sie die Compiler-Flags nicht festlegen müssen, da Sie in Ihrem Container nichts kompilieren.

verwandte Informationen