Beim Versuch, meine App in der GCloud App Engine bereitzustellen, wird der folgende Fehler angezeigt. Das Problem entsteht beim Versuch, die GDAL-Bibliothek zu meiner App hinzuzufügen.
Datei „/opt/python3.7/lib/python3.7/ctypes/init.py“, Zeile 377, in getattr func = self.getitem(name) Datei „/opt/python3.7/lib/python3.7/ctypes/init.py“, Zeile 382, in getitem func = self._FuncPtr((name_or_ordinal, self)) AttributeError: /usr/lib/libgdal.so.1: undefiniertes Symbol: OGR_F_GetFieldAsInteger64
Ich habe alle Anweisungen befolgt, die ich online finden konnte. Aber nichts scheint zu funktionieren. Hier sind meine app.yml-Dateien:
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
Und 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
Aktualisieren: Wie die meisten Online-Vorschläge zur Verwendung des Python3.8-Images.
FROM python:3.8
Wenn ich das versuche, erhalte ich die folgende Fehlermeldung:
/bin/sh: 1: virtualenv: nicht gefunden. Der Befehl „/bin/sh -c virtualenv /env -p python3“ hat einen Code ungleich Null zurückgegeben: 127. FEHLER. FEHLER: Build-Schritt 0 „gcr.io/cloud-builders/docker“ ist fehlgeschlagen: Schritt wurde mit einem Status ungleich Null beendet: 127.
Kann mir hier jemand helfen? Was muss ich tun, damit das funktioniert?
Antwort1
GDAL-Abhängigkeiten mit GAE können ziemlich nervig sein. Außerdem ist mir aufgefallen, dass das für die Flex-Umgebung veröffentlichte GAE-Image kein Python3.8 enthält, im Gegensatz zur Standardumgebung, die 3.8 enthalten soll (es geht bis zu Python3.7 für Flex, Sie können sie alle in sehen /opt/python3.*
). Sie sollten also 3.8 selbst installieren, plus ein paar notwendige GIS-Abhängigkeiten.
Probieren Sie dieses Dockerfile aus:
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
Dabei wird das Deadsnakes PPA verwendet, um die Python3.8-Binärdatei und Co. im Container zu installieren, sowie die neueren GDAL/GIS-Abhängigkeiten, da der GAE-Container auf Ubuntu 16.04 LTS (xenial) basiert, das mit einigen ziemlich veralteten Paketen geliefert wird. Beachten Sie, dass Sie die Compiler-Flags nicht festlegen müssen, da Sie in Ihrem Container nichts kompilieren.