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' 명령이 0이 아닌 코드를 반환했습니다: 127 오류 오류: 빌드 단계 0 "gcr.io/cloud-builders/ docker" 실패: 단계가 0이 아닌 상태로 종료되었습니다: 127

누군가 나를 도와주세요. 이 작업을 수행하려면 어떻게 해야 합니까?

답변1

GAE에 대한 GDAL 종속성은 꽤 고통스러울 수 있습니다. 또한 3.8을 포함해야 하는 표준 env와 달리 flex 환경용으로 게시된 GAE 이미지에는 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 종속성에도 포함됩니다. 컨테이너에서 아무것도 컴파일하지 않기 때문에 컴파일러 플래그를 설정할 필요가 없습니다.

관련 정보