Bagaimana cara mengatasi 'OSError: libc not found' dibesarkan di Gunicorn exec dari aplikasi Flask di dalam wadah buruh pelabuhan Alpine

13

Saya sedang mengerjakan aplikasi Flask berdasarkan aplikasi Microblog dari mega-tutorial Miguel Grinberg. Kode tinggal di sini: https://github.com/dnilasor/quickgig . Saya memiliki implementasi buruh pelabuhan yang bekerja dengan wadah MySQL 5.7 yang terhubung. Hari ini saya menambahkan fungsi Tampilan Admin menggunakan modul Flask-Admin. Ini berfungsi dengan indah disajikan secara lokal (OSX) pada server Flask melalui 'flask run' tetapi ketika saya membangun dan menjalankan gambar buruh pelabuhan baru (berdasarkan python: 3.8-alpine), macet saat boot dengan OSError: libc not foundkesalahan, kode yang sepertinya menunjukkan pustaka yang tidak dikenal

Sepertinya saya seperti Gunicorn tidak dapat melayani aplikasi setelah penambahan saya. Teman sekelas saya dan saya bingung!

Saya awalnya mendapat kesalahan menggunakan python: gambar dasar 3,6-alpine dan jadi mencoba dengan 3,7 dan 3,8 tidak berhasil. Saya juga memperhatikan bahwa saya secara berlebihan menambahkan PyMySQL, sekali dalam persyaratan.txt menentukan versi no. dan lagi secara eksplisit di dockerfile tanpa spesifikasi. Menghapus entri requirement.txt. Juga mencoba menambah versi Flask-Admin no. naik dan turun. Juga mencoba membersihkan migrasi basis data saya karena saya telah melihat banyak file migrasi yang menyebabkan wadah gagal untuk mem-boot (memang ini saat menggunakan SQLite). Sekarang hanya ada satu file migrasi dan berdasarkan jejak stack sepertinya flask db upgradeberfungsi dengan baik.

Satu hal yang belum saya coba adalah gambar dasar yang berbeda (kurang minimal?), Dapat segera dicoba dan perbarui ini. Tetapi masalah ini sangat misterius bagi saya sehingga saya pikir sudah waktunya untuk bertanya apakah ada orang lain yang melihatnya :)

Saya memang menemukan bug soket ini yang tampaknya berpotensi relevan tetapi seharusnya sepenuhnya diperbaiki di python 3.8.

Juga FYI saya mengikuti beberapa saran di sini tentang impor melingkar dan mengimpor fungsi pengontrol admin saya di dalam 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

Implementasi di 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))

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

Ketika saya menjalankan kontainer di terminal interaktif saya melihat jejak tumpukan berikut:

(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

Saya ingin aplikasi untuk boot / dilayani oleh gunicorn di dalam wadah sehingga saya dapat terus mengembangkan dengan tim saya menggunakan implementasi buruh pelabuhan dan meningkatkan MySQL buruh pelabuhan vs rasa sakit MySQL lokal untuk pengembangan. Bisakah Anda memberi saran?

Dnilasor
sumber

Jawaban:

7

Di Dockerfile Anda:

RUN apk add binutils libc-dev
Clay Hardin
sumber
Ini sepertinya berhasil. Sayangnya, ini secara dramatis meningkatkan ukuran gambar.
dcart1234
1
Terima kasih! Saya mengedit hanya menyertakan binutils dan libc-dev, membuat gambar lebih kecil. Saya tidak tahu apa yang perlu binutils, tetapi sepertinya sangat penting.
Clay Hardin
3

Ya Gunicorn 20.0.0 membutuhkan paket libc-dev .

Jadi ini bekerja untuk saya:

RUN apk --no-cache add libc-dev
Fabrizio Fubelli
sumber
Saya ingin ini bekerja dan mencobanya terlebih dahulu (benci penurunan versi / spesifikasi versi eksplisit) tetapi tidak: (
Dnilasor
apk add libc-devtidak bekerja untuk saya juga.
Devy
3

Ini adalah masalah dengan gunicorn 20.0.0, dilacak di sini: https://github.com/benoitc/gunicorn/issues/2160

Masalah ini diperbaiki di 20.0.1 dan seterusnya. Jadi, ubah ini:

RUN venv/bin/pip install gunicorn pymysql

untuk ini:

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

Jika memutakhirkan bukan opsi, sebagai solusi Anda dapat menambahkan baris berikut:

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

Sayangnya ini menambahkan sekitar 20MB ke wadah buruh pelabuhan yang dihasilkan, tetapi tidak ada solusi lain yang diketahui saat ini.

keju dan sereal
sumber
2

Masalah ini tampaknya terkait dengan versi baru Gunicorn 20.0.0. Coba gunakan yang sebelumnya 19.9.0

Dmitrii Dmitriev
sumber
1
python3 ctypes.util.find_library ('c') tidak berfungsi dengan benar di python: alpine
Dmitrii Dmitriev
Yap, python3 -c "from ctypes.util import find_library; print(find_library('c'))"kembaliNone
Devy
0

Saya telah memecahkan masalah ini:

  1. Dockerfile: hapus instalasi ini "RUN venv / bin / pip install gunicorn"
  2. requirement.txt: tambahkan baris ini "gunicorn == 19.7.1"
Bảo Nguyễn Cao
sumber
ya. digunakan 19.9.0 tetapi, yup
Dnilasor