Como fazer o GDAL funcionar com o Google GCLOUD

Como fazer o GDAL funcionar com o Google GCLOUD

Estou recebendo o erro abaixo ao tentar implantar meu aplicativo no gcloud app engine. Todo o problema é tentar adicionar a biblioteca GDAL ao meu aplicativo.

Arquivo "/opt/python3.7/lib/python3.7/ctypes/init.py", linha 377, em getattr func = self.getitem(name) Arquivo "/opt/python3.7/lib/python3.7/ ctypes/init.py", linha 382, ​​em getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: símbolo indefinido: OGR_F_GetFieldAsInteger64

Segui todas as instruções que pude encontrar online. Mas nada parece funcionar. Aqui estão meus arquivos 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

Atualizar: Como a maioria das sugestões online sobre o uso da imagem Python3.8.

FROM python:3.8

Quando tento isso, recebo o seguinte erro:

/bin/sh: 1: virtualenv: não encontrado O comando '/bin/sh -c virtualenv /env -p python3' retornou um código diferente de zero: 127 ERROR ERROR: build step 0 "gcr.io/cloud-builders/ docker" falhou: etapa encerrada com status diferente de zero: 127

Alguém me ajude aqui. O que preciso fazer para que isso funcione?

Responder1

As dependências do GDAL com o GAE podem ser bastante dolorosas. Além disso, notei que a imagem GAE publicada para o ambiente flex não inclui python3.8, ao contrário do env padrão que deveria incluir 3.8 (vai até python3.7 para flex, você pode ver todos eles em /opt/python3.*) Portanto, você mesmo deve instalar o 3.8, além de algumas dependências GIS necessárias.

Experimente 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

Isso usa o Deadsnakes PPA para instalar o binário python3.8 & co. no contêiner, bem como nas dependências GDAL/GIS mais recentes, já que o contêiner do GAE é baseado no Ubuntu 16.04 LTS (xenial), que vem com alguns pacotes bastante desatualizados. Observe que você não precisa definir os sinalizadores do compilador porque não está compilando nada em seu contêiner.

informação relacionada