python - كيفية معالجة "OSError: libc لم يتم العثور على" مرفوع على تطبيق Gunicorn exec من Flask داخل حاوية الإرساء في جبال الألب




docker sockets (4)

أنا أعمل على تطبيق Flask استنادًا إلى تطبيق Microblog من البرنامج التعليمي الضخم لـ Miguel Grinberg. رمز يعيش هنا: https://github.com/dnilasor/quickgig . لدي تطبيق عامل ميناء مع حاوية MySQL 5.7 مرتبطة. أضفت اليوم وظيفة عرض المسؤول باستخدام وحدة Flask-Admin. يعمل بشكل جميل محلياً (OSX) على خادم Flask عبر "تشغيل قارورة" ولكن عندما أقوم بإنشاء وتشغيل صورة عامل ميناء جديد (استنادًا إلى python: 3.8- OSError: libc not found ) ، فإنه يتعطل عند التمهيد باستخدام OSError: libc not found خطأ OSError: libc not found ، الرمز الذي يبدو أنه يشير إلى مكتبة غير معروفة

يبدو لي أن Gunicorn غير قادر على خدمة التطبيق بعد الإضافات الخاصة بي. أنا وزميلي في الحيرة!

لقد حصلت في الأصل على الخطأ باستخدام python: 3.6-alpine base base and so tryed with 3.7 and 3.8 and no جدوى. لقد لاحظت أيضًا أنني كنت أضيف PyMySQL بشكل متكرر ، مرة واحدة في requirements.txt لتحديد الإصدار رقم. ومرة أخرى صراحة في dockerfile مع عدم وجود المواصفات. تمت إزالة إدخال requirements.txt. حاول أيضًا زيادة إصدار Flask-Admin رقم. اعلى واسفل. حاول أيضًا تنظيف عمليات ترحيل قاعدة البيانات الخاصة بي حيث رأيت عدة ملفات ترحيل تسببت في فشل الحاوية في التمهيد (من المسلم به أن هذا كان عند استخدام SQLite). الآن لا يوجد سوى ملف ترحيل واحد وبناءً على تتبع المكدس ، يبدو أن flask db upgrade تعمل بشكل جيد.

هناك شيء واحد لم أجربه حتى الآن وهو صورة أساسية مختلفة (أقل حد أدنى؟) ، يمكن تجربتها قريبًا وتحديثها. لكن المسألة غامضة بالنسبة لي لدرجة أنني اعتقدت أن الوقت قد حان للسؤال عما إذا كان أي شخص آخر قد رأى ذلك:)

لقد وجدت هذا الخطأ مأخذ التوصيل الذي يبدو محتملا ولكن كان من المفترض أن تكون ثابتة بالكامل في بيثون 3.8.

كما اتبعت FYI بعض النصائح here حول الواردات الدائرية واستوردت وظيفة تحكم المشرف الخاصة بي داخل create_app .

Dockerfile:

FROM python:3.8-alpine

RUN adduser -D quickgig

WORKDIR /home/quickgig

COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install -r requirements.txt
RUN venv/bin/pip install gunicorn pymysql

COPY app app
COPY migrations migrations
COPY quickgig.py config.py boot.sh ./
RUN chmod +x boot.sh

ENV FLASK_APP quickgig.py

RUN chown -R quickgig:quickgig ./
USER quickgig

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

boot.sh:

#!/bin/sh
source venv/bin/activate
while true; do
    flask db upgrade
    if [[ "$?" == "0" ]]; then
        break
    fi
    echo Upgrade command failed, retrying in 5 secs...
    sleep 5
done
# flask translate compile
exec gunicorn -b :5000 --access-logfile - --error-logfile - quickgig:app

التنفيذ في init .py:

from flask_admin import Admin
app_admin = Admin(name='Dashboard')

def create_app(config_class=Config):
  app = Flask(__name__)
  app.config.from_object(config_class)
...
  app_admin.init_app(app)

...
  from app.admin import add_admin_views
  add_admin_views()
...
  return app

from app import models

admin.py:

from flask_admin.contrib.sqla import ModelView
from app.models import User, Gig, Neighborhood
from app import db
# Add views to app_admin

def add_admin_views():
    from . import app_admin
    app_admin.add_view(ModelView(User, db.session))
    app_admin.add_view(ModelView(Neighborhood, db.session))
    app_admin.add_view(ModelView(Gig, db.session))

requirements.txt:

alembic==0.9.6
Babel==2.5.1
blinker==1.4
certifi==2017.7.27.1
chardet==3.0.4
click==6.7
dominate==2.3.1
elasticsearch==6.1.1
Flask==1.0.2
Flask-Admin==1.5.4
Flask-Babel==0.11.2
Flask-Bootstrap==3.3.7.1
Flask-Login==0.4.0
Flask-Mail==0.9.1
Flask-Migrate==2.1.1
Flask-Moment==0.5.2
Flask-SQLAlchemy==2.3.2
Flask-WTF==0.14.2
guess-language-spirit==0.5.3
idna==2.6
itsdangerous==0.24
Jinja2==2.10
Mako==1.0.7
MarkupSafe==1.0
PyJWT==1.5.3
python-dateutil==2.6.1
python-dotenv==0.7.1
python-editor==1.0.3
pytz==2017.2
requests==2.18.4
six==1.11.0
SQLAlchemy==1.1.14
urllib3==1.22
visitor==0.1.3
Werkzeug==0.14.1
WTForms==2.1

عندما أقوم بتشغيل الحاوية في محطة تفاعلية ، أرى تتبع المكدس التالي:

(venv) ****s-MacBook-Pro:quickgig ****$ docker run -ti quickgig:v7
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 1f5feeca29ac, test
Traceback (most recent call last):
  File "/home/quickgig/venv/bin/gunicorn", line 6, in <module>
    from gunicorn.app.wsgiapp import run
  File "/home/quickgig/venv/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 9, in <module>
    from gunicorn.app.base import Application
  File "/home/quickgig/venv/lib/python3.8/site-packages/gunicorn/app/base.py", line 12, in <module>
    from gunicorn.arbiter import Arbiter
  File "/home/quickgig/venv/lib/python3.8/site-packages/gunicorn/arbiter.py", line 16, in <module>
    from gunicorn import sock, systemd, util
  File "/home/quickgig/venv/lib/python3.8/site-packages/gunicorn/sock.py", line 14, in <module>
    from gunicorn.socketfromfd import fromfd
  File "/home/quickgig/venv/lib/python3.8/site-packages/gunicorn/socketfromfd.py", line 26, in <module>
    raise OSError('libc not found')
OSError: libc not found

أرغب في تشغيل التطبيق / تقديمه بواسطة gunicorn داخل الحاوية حتى أتمكن من متابعة التطوير مع فريقي باستخدام تطبيق docker والاستفادة من MySQL مقابل ألم MySQL المحلي من أجل التطوير. هل تستطيع أن تنصح؟


في Dockerfile الخاص بك:

RUN apk add binutils libc-dev

لقد حللت هذه المشكلة:

  1. Dockerfile: إزالة هذا التثبيت "RUN venv / bin / pip install gunicorn"
  2. requirements.txt: أضف هذا السطر "gunicorn == 19.7.1"

هذه مشكلة في gunicorn 20.0.0 والتي يتم تتبعها حاليًا هنا: https://github.com/benoitc/gunicorn/issues/2160

حتى يتم إصلاح المشكلة وإصدارها ، يمكنك ببساطة إضافة السطر التالي:

RUN apk --no-cache add binutils musl-dev

لسوء الحظ ، يضيف هذا حوالي 20 ميغابايت إلى حاوية عامل النقل الناتجة ، ولكن لا يوجد أي حل آخر معروف في الوقت الحالي.


يبدو أن هذه المشكلة تتعلق بإصدار جديد من Gunicorn 20.0.0. محاولة استخدام سابق 19.9.0





gunicorn