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 found
Fehler 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 upgrade
funktionieren.
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?