Alpine docker konteyneri içindeki Flask uygulamasının Gunicorn çalıştırmasında yükseltilen 'OSError: libc bulunamadı'


13

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 upgradeiyi ç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?

Yanıtlar:


7

Dockerfile dosyasında:

RUN apk add binutils libc-dev

Bu işe yarıyor gibi görünüyor. Ne yazık ki, görüntünün boyutunu önemli ölçüde artırır.
dcart1234

1
Teşekkürler! Sadece binutils ve libc-dev'i içerecek şekilde düzenledim ve görüntüyü küçülttüm. Binutililere neyin ihtiyacı olduğunu bilmiyorum, ama çok önemli gibi görünüyor.
Clay Hardin

3

Evet Gunicorn 20.0.0 libc-dev paketini gerektirir .

Bu benim için çalışıyor:

RUN apk --no-cache add libc-dev

Bu çalışmak istedim ve ilk denedim (düşürme / açık sürümleri belirtmekten nefret ediyorum) ama olmadı: (
Dnilasor

apk add libc-devbenim için de çalışmadı.
Devy

3

Bu, burada izlenen gunicorn 20.0.0 ile ilgili bir sorundu: https://github.com/benoitc/gunicorn/issues/2160

Sorun 20.0.1 ve sonrasında düzeltildi. Yani, bunu değiştirin:

RUN venv/bin/pip install gunicorn pymysql

buna:

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

Yükseltme bir seçenek değilse, geçici bir çözüm olarak aşağıdaki satırı ekleyebilirsiniz:

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

Maalesef bu, sonuçta bulunan docker konteynerine yaklaşık 20 MB ekler, ancak şu anda bilinen başka bir geçici çözüm yoktur.


2

Bu sorun, Gunicorn 20.0.0'ın yeni bir sürümü ile ilgili gibi görünüyor. Bir öncekini kullanmaya çalışın 19.9.0


1
python3 ctypes.util.find_library ('c') python'da düzgün çalışmıyor: alp
Dmitrii Dmitriev

Evet, python3 -c "from ctypes.util import find_library; print(find_library('c'))"geri dönüyorNone
Devy

0

Bu sorunu çözdüm:

  1. Dockerfile: "RUN venv / bin / pip install gunicorn" kurulumunu kaldırın
  2. gereksinim.txt: bu satırı ekleyin "gunicorn == 19.7.1"

Evet. 19.9.0 kullanılmış, ancak, yup
Dnilasor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.