Wie man 'OSError: libc not found' adressiert, das auf Gunicorn exec der Flask-App im alpinen Docker-Container ausgelöst wurde

13

Ich arbeite an einer Flask-Anwendung, die auf der Microblog-App aus Miguel Grinbergs Mega-Tutorial basiert. Code lebt hier: https://github.com/dnilasor/quickgig . Ich habe eine funktionierende Docker-Implementierung mit einem verknüpften MySQL 5.7-Container. Heute habe ich eine Admin View-Funktion mit dem Flask-Admin-Modul hinzugefügt. Es funktioniert wunderbar lokal (OSX) auf dem Flask-Server über 'flask run', aber wenn ich das neue Docker-Image (basierend auf Python: 3.8-alpine) erstelle und ausführe, stürzt es beim Booten mit einem OSError: libc not foundFehler ab, dessen Code zu sein scheint Geben Sie eine unbekannte Bibliothek an

Es sieht für mich so aus, als ob Gunicorn die App nach meinen Ergänzungen nicht bedienen kann. Mein Klassenkamerad und ich sind ratlos!

Ich habe ursprünglich den Fehler mit dem Python: 3.6-alpinen Basisbild bekommen und habe es daher mit 3.7 und 3.8 ohne Erfolg versucht. Ich bemerkte auch, dass ich PyMySQL redundant hinzufügte, einmal in der Datei "resources.txt" unter Angabe der Versionsnummer. und wieder explizit in der Docker-Datei ohne Angabe. Der Eintrag require.txt wurde entfernt. Es wurde auch versucht, die Flask-Admin-Versionsnummer zu erhöhen. auf und ab. Ich habe auch versucht, meine Datenbankmigrationen zu bereinigen, da mehrere Migrationsdateien dazu geführt haben, dass der Container nicht gestartet werden konnte (zugegebenermaßen bei Verwendung von SQLite). Jetzt gibt es nur noch eine einzige Migrationsdatei und basierend auf dem Stack-Trace scheint das einwandfrei zu flask db upgradefunktionieren.

Eine Sache, die ich noch nicht ausprobiert habe, ist ein anderes Basis-Image (weniger minimal?). Kann es bald versuchen und aktualisieren. Aber das Problem ist für mich so mysteriös, dass ich dachte, es wäre Zeit zu fragen, ob jemand anderes es gesehen hat :)

Ich habe diesen Socket-Fehler gefunden, der möglicherweise relevant schien, aber in Python 3.8 vollständig behoben sein sollte.

Auch FYI folgte ich einige der Ratschläge hier auf Kreis Importen und importierte meine Admin - Controller - Funktion innerhalb 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

Implementierung in 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))

Anforderungen.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

Wenn ich den Container im interaktiven Terminal ausführe, wird die folgende Stapelverfolgung angezeigt:

(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

Ich möchte, dass die App von Gunicorn im Container gestartet / bereitgestellt wird, damit ich mit meinem Team die Docker-Implementierung fortsetzen und Docker-MySQL gegen die Schmerzen von lokalem MySQL für die Entwicklung nutzen kann. Kannst du beraten?

Dnilasor
quelle

Antworten:

7

In Ihrer Docker-Datei:

RUN apk add binutils libc-dev
Clay Hardin
quelle
Das scheint zu funktionieren. Leider vergrößert es das Bild dramatisch.
dcart1234
1
Vielen Dank! Ich habe es so bearbeitet, dass es nur binutils und libc-dev enthält, wodurch das Bild kleiner wird. Ich weiß nicht, was Binutils braucht, aber es scheint entscheidend zu sein.
Clay Hardin
3

Ja, Gunicorn 20.0.0 benötigt das Paket libc-dev .

Das funktioniert also für mich:

RUN apk --no-cache add libc-dev
Fabrizio Fubelli
quelle
Ich wollte, dass dies funktioniert und versuchte es zuerst (ich hasse es, explizite Versionen herunterzustufen / anzugeben), aber es tat es nicht: (
Dnilasor
apk add libc-devhat auch bei mir nicht funktioniert.
Devy
3

Dies war ein Problem mit Gunicorn 20.0.0, das hier verfolgt wurde: https://github.com/benoitc/gunicorn/issues/2160

Das Problem wurde in 20.0.1 und höher behoben. Ändern Sie dies also:

RUN venv/bin/pip install gunicorn pymysql

dazu:

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

Wenn ein Upgrade nicht möglich ist, können Sie als Problemumgehung die folgende Zeile hinzufügen:

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

Leider werden dadurch etwa 20 MB zum resultierenden Docker-Container hinzugefügt, aber es ist derzeit keine andere Problemumgehung bekannt.

Käse und Getreide
quelle
2

Dieses Problem scheint mit einer neuen Version von Gunicorn 20.0.0 zu tun zu haben. Versuchen Sie, eine frühere Version 19.9.0 zu verwenden

Dmitrii Dmitriev
quelle
1
python3 ctypes.util.find_library ('c') funktioniert in python nicht richtig: alpine
Dmitrii Dmitriev
Ja, python3 -c "from ctypes.util import find_library; print(find_library('c'))"kehrt zurückNone
Devy
0

Ich habe dieses Problem gelöst:

  1. Dockerfile: entferne diese Installation "RUN venv / bin / pip install gunicorn"
  2. request.txt: füge diese Zeile hinzu "gunicorn == 19.7.1"
Bảo Nguyễn Cao
quelle
Jep. verwendet 19.9.0 aber, yup
Dnilasor