Miguel Grinberg'in mega dersinden Microblog uygulamasına dayanan bir Flask uygulaması üzerinde çalışıyorum. Kod burada yaşıyor: https://github.com/dnilasor/quickgig . Bağlantılı bir MySQL 5.7 kapsayıcısı ile çalışan bir docker uygulaması var. Bugün Flask-Admin modülünü kullanarak bir Yönetici Görünümü işlevi ekledim. Flask sunucusunda 'flask run' aracılığıyla yerel olarak güzelce hizmet veriyor (OSX), ancak yeni docker görüntüsünü (python: 3.8-alpine dayanarak) oluşturup çalıştırdığımda OSError: libc not found
, kodda bir hata ile önyükleme yapılıyor. belirtmek bilinmeyen bir kütüphane
Gunicorn, eklemelerimden sonra uygulamaya hizmet edemiyor gibi görünüyor. Sınıf arkadaşım ve ben güdük!
Başlangıçta python kullanarak hata aldım: 3.6-alpine temel görüntü ve böylece 3.7 ve 3.8 ile boşuna çalıştı. Ben de bir kez gereksinimler.txt sürüm no belirten PyMySQL, ekliyorum fark ettim. ve yine açıkça hiçbir spec ile dockerfile içinde. Needs.txt girdisi kaldırıldı. Ayrıca Flask-Yönetici sürüm no. yukarı ve aşağı. Ayrıca kapsayıcı önyükleme başarısız neden birden fazla geçiş dosyaları gördük gibi benim veritabanı taşıma temizleme çalıştı (kuşkusuz bu SQLite kullanırken oldu). Şimdi sadece tek bir taşıma dosyası var ve yığın izlemeye dayanarak flask db upgrade
iyi çalışıyor gibi görünüyor .
Henüz denemem gereken bir şey, farklı bir temel görüntü (daha az minimal?), Yakında deneyebilir ve bunu güncelleyebilir. Ama sorun benim için çok gizemli, başka birinin görüp görmediğini sormanın zamanını düşündüm :)
Potansiyel olarak alakalı görünen bu soket hatasını buldum, ancak python 3.8'de tamamen düzeltilmesi gerekiyordu.
Ayrıca Bilginize ben tavsiye bazı izledi burada dairesel ithalata ve benim yönetici kontrolör fonksiyonu içini ithal 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
Uygulama başlatma .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
Kapsayıcıyı etkileşimli terminalde çalıştırdığımda aşağıdaki yığın izini görüyorum:
(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
Uygulamanın kap içinde gunicorn tarafından önyüklenmesini / hizmet edilmesini istiyorum, böylece docker uygulamasını kullanarak ve geliştirme için yerel MySQL'in acısına karşı dockerized MySQL'den yararlanarak ekibimle geliştirmeye devam edebilirim. Tavsiye verebilirmisin?