GDAL を Google GCLOUD で動作させる方法

GDAL を Google GCLOUD で動作させる方法

アプリを gcloud app engine にデプロイしようとすると、以下のエラーが発生します。この問題は、アプリに GDAL ライブラリを追加しようとしたことに起因しています。

ファイル "/opt/python3.7/lib/python3.7/ctypes/init.py"、行 377、getattr 内 func = self.getitem(name) ファイル "/opt/python3.7/lib/python3.7/ctypes/init.py"、行 382、getitem 内 func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: 未定義のシンボル: OGR_F_GetFieldAsInteger64

オンラインで見つけられる指示はすべて実行しました。しかし、何も機能しないようです。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 

そして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

アップデート: Python3.8 イメージを使用するオンラインのほとんどの提案どおり。

FROM python:3.8

これを実行すると、次のエラーが発生します。

/bin/sh: 1: virtualenv: 見つかりません コマンド '/bin/sh -c virtualenv /env -p python3' がゼロ以外のコードを返しました: 127 エラー エラー: ビルド ステップ 0 "gcr.io/cloud-builders/docker" が失敗しました: ステップがゼロ以外のステータスで終了しました: 127

誰か助けてください。これを機能させるには何をする必要がありますか?

答え1

GAE の GDAL 依存関係はかなり厄介です。また、flex 環境用に公開された GAE イメージには、3.8 が含まれているはずの標準 env とは異なり、python3.8 が含まれていないことに気付きました (flex では python3.7 まで含まれており、すべて で確認できます/opt/python3.*)。そのため、3.8 といくつかの必要な GIS 依存関係を自分でインストールする必要があります。

この 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

これは Deadsnakes PPA を使用して、コンテナーに python3.8 バイナリなどをインストールします。また、GAE のコンテナーは Ubuntu 16.04 LTS (xenial) に基づいており、かなり古いパッケージが付属しているため、新しい GDAL/GIS 依存関係もインストールします。コンテナー内では何もコンパイルしないため、コンパイラ フラグを設定する必要はありません。

関連情報