GDALをGoogleGCLOUDと連携させる方法

Aug 22 2020

アプリをgcloudappengineにデプロイしようとすると以下のエラーが発生します。全体的な問題は、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:undefined symbol: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 "failed:ステップがゼロ以外のステータスで終了しました:127

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

回答

HendrikF Sep 25 2020 at 21:24

GAEとのGDALの依存関係は、かなり苦痛を伴う可能性があります。また、フレックス環境用に公開されたGAEイメージには、3.8を含むはずの標準環境とは異なりpython3.8が含まれていないことに気付きました(フレックスの場合は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バイナリ&coをインストールします。コンテナ内、およびGAEのコンテナはUbuntu 16.04 LTS(xenial)に基づいているため、新しいGDAL / GIS依存関係には、かなり古いパッケージが付属しています。コンテナ内で何もコンパイルしていないため、コンパイラフラグを設定する必要がないことに注意してください。