Come far funzionare GDAL con Google GCLOUD

Aug 22 2020

Ricevo l'errore seguente durante il tentativo di distribuire la mia app su gcloud app engine. L'intero problema deriva dal tentativo di aggiungere la libreria GDAL alla mia app.

File "/opt/python3.7/lib/python3.7/ctypes/init.py", riga 377, in getattr func = self.getitem(nome) File "/opt/python3.7/lib/python3.7/ ctypes/init.py", riga 382, ​​in getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: simbolo non definito: OGR_F_GetFieldAsInteger64

Ho seguito tutte le indicazioni che potevo trovare online. Ma nulla sembra funzionare affatto. Ecco i miei file app.yml:

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 

E 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

Aggiornamento: come la maggior parte dei suggerimenti online sull'utilizzo dell'immagine Python3.8.

FROM python:3.8

Quando lo provo, ottengo il seguente errore:

/bin/sh: 1: virtualenv: non trovato Il comando '/bin/sh -c virtualenv /env -p python3' ha restituito un codice diverso da zero: 127 ERROR ERROR: build step 0 "gcr.io/cloud-builders/ docker" non riuscito: passaggio terminato con stato diverso da zero: 127

Qualcuno mi aiuti qui. Cosa devo fare per farlo funzionare?

Risposte

HendrikF Sep 25 2020 at 21:24

Le dipendenze GDAL con GAE possono essere piuttosto dolorose. Inoltre, ho notato che l'immagine GAE pubblicata per l'ambiente flex non include python3.8 a differenza dell'env standard che dovrebbe includere 3.8 (va fino a python3.7 per flex, puoi vederli tutti in /opt/python3.*) Quindi, dovresti installare tu stesso 3.8 più alcune dipendenze GIS necessarie.

Prova questo Dockerfile:

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

Questo utilizza Deadsnakes PPA per installare il binario python3.8 & co. nel contenitore così come le nuove dipendenze GDAL/GIS poiché il contenitore di GAE è basato su Ubuntu 16.04 LTS (xenial) che viene fornito con alcuni pacchetti piuttosto datati. Nota che non è necessario impostare i flag del compilatore perché non stai compilando nulla nel tuo contenitore.