Cómo hacer que GDAL funcione con Google GCLOUD

Cómo hacer que GDAL funcione con Google GCLOUD

Recibo el siguiente error al intentar implementar mi aplicación en el motor de aplicaciones de gcloud. Todo el problema surge al intentar agregar la biblioteca GDAL a mi aplicación.

Archivo "/opt/python3.7/lib/python3.7/ctypes/init.py", línea 377, en getattr func = self.getitem(nombre) Archivo "/opt/python3.7/lib/python3.7/ ctypes/init.py", línea 382, ​​en getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: símbolo no definido: OGR_F_GetFieldAsInteger64

Seguí todas las instrucciones que pude encontrar en línea. Pero nada parece funcionar en absoluto. Aquí están mis archivos 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 

Y 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

Actualizar: Como la mayoría de las sugerencias en línea sobre el uso de la imagen Python3.8.

FROM python:3.8

Cuando intento eso, aparece el siguiente error:

/bin/sh: 1: virtualenv: no encontrado El comando '/bin/sh -c virtualenv /env -p python3' devolvió un código distinto de cero: 127 ERROR ERROR: paso de compilación 0 "gcr.io/cloud-builders/ Docker" falló: el paso salió con un estado distinto de cero: 127

Alguien me ayuda aquí. ¿Qué debo hacer para que esto funcione?

Respuesta1

Las dependencias de GDAL con GAE pueden ser bastante dolorosas. Además, he notado que la imagen GAE publicada para el entorno flexible no incluye python3.8 a diferencia del entorno estándar que se supone que incluye 3.8 (llega hasta python3.7 para flex, puedes verlos todos en /opt/python3.*) Por lo tanto, usted mismo debe instalar 3.8 más algunas dependencias SIG necesarias.

Pruebe este 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

Esto utiliza el PPA de Deadsnakes para instalar el binario python3.8 & co. en el contenedor, así como las dependencias GDAL/GIS más nuevas, ya que el contenedor de GAE está basado en Ubuntu 16.04 LTS (xenial), que viene con algunos paquetes bastante anticuados. Tenga en cuenta que no necesita configurar los indicadores del compilador porque no está compilando nada en su contenedor.

información relacionada