python -magi c в GCP App Engine - не удается развернуть - PullRequest
0 голосов
/ 03 февраля 2020

Я работаю над приложением Python, которое будет развернуто на GCP App Engine.
Я пытался использовать функциональность python-magic.
Я добавил import magic в свой код и python-magic в файл requirements.txt.
Но когда я пытаюсь развернуть код в App Engine, происходит сбой со следующей ошибкой:

[2020-02-03 15:35:23 +0000] [8] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/env/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
    self.load_wsgi()
  File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/env/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
    return self.load_wsgiapp()
  File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/env/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
    __import__(module)
  File "/home/vmagent/app/main.py", line 11, in <module>
    import magic
  File "/env/lib/python3.6/site-packages/magic.py", line 181, in <module>
    raise ImportError('failed to find libmagic.  Check your installation')
ImportError: failed to find libmagic.  Check your installation
[2020-02-03 15:35:23 +0000] [8] [INFO] Worker exiting (pid: 8)
[2020-02-03 15:35:23 +0000] [1] [INFO] Shutting down: Master
[2020-02-03 15:35:23 +0000] [1] [INFO] Reason: Worker failed to boot.

Что мне не хватает в настройке, чтобы эта работа работала?


РЕДАКТИРОВАТЬ: общий доступ к минимальным настройкам для воспроизведения этой ошибки

main.py

# -*- coding: utf-8 -*-

import json
import base64
import magic

import logging
logging.basicConfig(level=logging.DEBUG)

from flask import Flask, request, abort

app = Flask(__name__)

@app.route('/parse', methods=['POST'])
def parse():

    try:
        #input should be a b64 encoded byte string
        input = request.get_json()['input']
    except Exception as e:
        abort(400, 'An error occured while reading in parameters: {}'.format(str(e)))

    decoded_input_data = base64.decodebytes(input)
    mime = magic.Magic(mime=True)
    file_ext = mime.from_buffer(decoded_input_data)

    returnData = {}
    returnData['Status'] = 200
    returnData['file_ext'] = file_ext

    return json.dumps(returnData), 200

@app.errorhandler(Exception)
def error(e):
    logging.exception(str(e))
    return json.dumps({'Status': e.code,
                       'Message': e.description}), e.code

if __name__ == '__main__':
    # This is used when running locally. Gunicorn is used to run the
    # application on Google App Engine. See entrypoint in app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

needs.txt

Flask==1.0.2
gunicorn==19.9.0
google-cloud-vision==0.38.0
google-cloud-bigquery==1.11.2
google-cloud-storage==1.15.0
requests-toolbelt==0.9.1
protobuf==3.6.0
python-magic==0.4.15

app.yaml

runtime: python
env: flex
service: myservicename
entrypoint: gunicorn -b :$PORT main:app --timeout 240 --limit-request-line 0

runtime_config:
  python_version: 3

1 Ответ

1 голос
/ 04 февраля 2020

Если вы хотите использовать библиотеку python -magi c, вы можете выполнить следующую процедуру:

App Engine Standard

  1. Используйте модуль venv * для создания изолированной среды Python в каталоге, внешнем по отношению к вашему проекту, и активируйте его с помощью:
python3 -m venv env
source env/bin/activate
Установите библиотеку python -magi c с помощью pip, выполнив:
pip install python-magic
Добавьте библиотеку в ваш файл needs.txt. Например, если вы запускаете Quickstart из Официальной документации, ваш файл needs.txt должен выглядеть следующим образом:
Flask==1.1.1
python-magic==0.4.15
Выполните импорт библиотеки в соответствующий модуль кода вашего приложения. Например, если вы запускаете Quickstart из Официальной документации, соответствующий раздел вашего файла main.py должен выглядеть следующим образом:
...
# [START gae_python37_app]
from flask import Flask
import magic

# If `entrypoint` is not defined in app.yaml, App Engine will look for an app
# called `app` in `main.py`.
app = Flask(__name__)
...

App Engine Flexible Библиотека libmagi c C предварительно не установлена ​​в среде Flex ( здесь - список установленных библиотек). Поэтому вам нужно будет создать пользовательскую среду выполнения .

, изменив ваш app.yaml на следующее:

runtime: custom
env: flex

И добавив соответствующий файл Docker в каталог вашего проекта. , Например:

FROM python:3.7
WORKDIR /app
COPY . /app
RUN apt-get update &&\
    apt-get install -y libmagic-dev
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["gunicorn", "main:app", "-b", ":8080", "--timeout", "300"]

должно быть достаточно для успешного развертывания приложения.

Обратите внимание, что Dockerfile просто устанавливает библиотеку libmagi c C, затем устанавливает ваш файл require.txt и, наконец, запускает gunicorn в порту, необходимом для App Engine. Но не стесняйтесь адаптировать его к вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...