कैसे पता करें 'OSError: libc not found' को एल्पाइन डॉकटर कंटेनर के अंदर फ्लास्क ऐप के Gunicorn एग्जीक्यूटिव पर उठाया गया है।


13

मैं मिगुएल ग्रिनबर्ग के मेगा-ट्यूटोरियल से माइक्रोब्लॉग ऐप पर आधारित एक फ्लास्क एप्लिकेशन पर काम कर रहा हूं। कोड यहाँ रहता है: https://github.com/dnilasor/quickgig । मेरे पास एक लिंक किए गए MySQL 5.7 कंटेनर के साथ एक कार्य करने वाला कार्यान्वयन है। आज मैंने फ्लास्क-एडमिन मॉड्यूल का उपयोग करके एक व्यवस्थापक दृश्य फ़ंक्शन जोड़ा। यह फ्लास्क सर्वर पर 'फ्लास्क रन' के माध्यम से स्थानीय स्तर पर (OSX) खूबसूरती से काम करता है, लेकिन जब मैं नए डॉकटर चित्र (पायथन: 3.8-अल्पाइन पर आधारित) का निर्माण करता हूं और उसे चलाता हूं, तो यह एक OSError: libc not foundत्रुटि के साथ बूट पर क्रैश हो जाता है , जिस पर कोड लगता है अज्ञात पुस्तकालय इंगित करें

यह मुझे ऐसा लग रहा है जैसे मेरे संवादों के बाद Gunicorn ऐप की सेवा करने में असमर्थ है। मेरे सहपाठी और मैं स्तब्ध हैं!

मुझे मूल रूप से अजगर का उपयोग करने में त्रुटि मिली: 3.6-अल्पाइन आधार छवि और इसलिए 3.7 और 3.8 के साथ कोई फायदा नहीं हुआ। मैंने यह भी देखा कि मैं अनावश्यक रूप से PyMySQL को जोड़ रहा था, एक बार आवश्यकताओं में। और फिर स्पष्ट रूप से dockerfile में बिना किसी युक्ति के। आवश्यकताओं को हटा दिया। प्रवेश प्रविष्टि। इसके अलावा फ्लास्क-एडमिन संस्करण संख्या को बढ़ाने की कोशिश की गई। ऊपर और नीचे। अपने डेटाबेस माइग्रेशन को साफ करने की भी कोशिश की, क्योंकि मैंने कई माइग्रेशन फ़ाइलों को देखा है जिससे कंटेनर बूट होने में विफल रहा है (माना जाता है कि यह एसक्यूएल का उपयोग करते समय था)। अब केवल एक ही माइग्रेशन फ़ाइल है और स्टैक ट्रेस के आधार पर ऐसा लगता है कि यह flask db upgradeठीक काम करता है।

एक चीज जो मुझे आजमाई जानी है वह एक अलग आधार छवि (कम से कम?) है, जल्द ही कोशिश कर सकते हैं और इसे अपडेट कर सकते हैं। लेकिन यह मुद्दा मेरे लिए इतना रहस्यमय है कि मुझे यह पूछने का समय मिला कि क्या किसी और ने इसे देखा है:)

मुझे यह सॉकेट बग मिला, जो संभावित रूप से प्रासंगिक लग रहा था, लेकिन यह अजगर 3.8 में पूरी तरह से तय होना चाहिए था।

इसके अलावा FYI करें मैंने परिपत्र आयात पर यहां कुछ सलाह का पालन किया और अपने व्यवस्थापक नियंत्रक फ़ंक्शन को अंदर आयात किया 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 बनाम dockerized का लाभ उठाकर निरंतर विकास कर सकूं। क्या आप सुझाव दे सकते हैं?

जवाबों:


7

आपके डॉकफाइल में:

RUN apk add binutils libc-dev

यह काम करने लगता है। दुर्भाग्य से, यह नाटकीय रूप से छवि के आकार को बढ़ाता है।
dcart1234

1
धन्यवाद! मैंने केवल बिनुटिल्स और लिबास-देव को शामिल किया, जिससे छवि छोटी हो गई। मुझे नहीं पता कि क्या जरूरत है, लेकिन यह महत्वपूर्ण प्रतीत होता है।
क्ले हार्डिन

3

हाँ Gunicorn 20.0.0 को पैकेज libc-dev की आवश्यकता होती है ।

तो यह मेरे लिए काम करता है:

RUN apk --no-cache add libc-dev

मैं चाहता था कि यह काम करे और पहले इसे आज़माए (घृणा को कम करने / स्पष्ट संस्करणों को निर्दिष्ट करने के लिए) लेकिन यह नहीं हुआ: (
दिनीलासर

apk add libc-devमेरे लिए भी काम नहीं किया।
देवी

3

यह 20.0.0 के साथ एक मुद्दा था, जिसे यहां ट्रैक किया गया: https://github.com/benoitc/gunicorn/issues/2160

समस्या 20.0.1 और फ़ॉरवर्ड में तय की गई है। तो, इसे बदलें:

RUN venv/bin/pip install gunicorn pymysql

इसके लिए:

RUN venv/bin/pip install 'gunicorn>=20.0.1,<21' pymysql

यदि अपग्रेड करना एक विकल्प नहीं है, तो वर्कअराउंड के रूप में आप निम्न पंक्ति जोड़ सकते हैं:

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

दुर्भाग्य से यह परिणामी docker कंटेनर में लगभग 20MB जोड़ता है, लेकिन फिलहाल कोई अन्य ज्ञात समाधान नहीं है।


2

यह समस्या Gunicorn 20.0.0 के नए संस्करण से संबंधित लगती है। पिछले एक 19.9.0 का उपयोग करने का प्रयास करें


1
अल्पाइन: python3 ctypes.util.find_library ( 'सी') अजगर में सही ढंग से काम नहीं करता है
Dmitrii द्मित्रिएव

हां, python3 -c "from ctypes.util import find_library; print(find_library('c'))"रिटर्नNone
Devy

0

मैंने इस समस्या को हल कर लिया है:

  1. Dockerfile: इस स्थापना को हटा दें "RUN venv / bin / pip install gunicorn"
  2. आवश्यकता। कपड़ा: इस पंक्ति को "gunicorn == 19.7.1" जोड़ें

हाँ। 19.9.0 लेकिन, युप का इस्तेमाल किया
डायनालासर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.