Як звернутися до "OSError: libc не знайдено", піднятого на Gunicorn exec програми Flask всередині альпійського докерного контейнера


13

Я працюю над додатком Flask на основі програми Microblog з мегауроку Мігеля Грінберга. Код живе тут: https://github.com/dnilasor/quickgig . У мене працює реалізація докера із пов'язаним контейнером MySQL 5.7. Сьогодні я додав функцію перегляду адміністратора за допомогою модуля Flask-Admin. Він прекрасно працює локально (OSX) на сервері Flask через 'flask run', але коли я створюю і запускаю новий образ докера (на основі python: 3,8-alpine), він виходить з ладу під час завантаження з OSError: libc not foundпомилкою, код для якого, здається, вказати невідому бібліотеку

Мені здається, що Gunicorn не може обслуговувати додаток після моїх доповнень. Ми з однокласником спотикаємося!

Спочатку я отримав помилку за допомогою базового зображення python: 3,6-альпійський і тому спробував з 3,7 та 3,8 безрезультатно. Я також зауважив, що я надмірно додав PyMySQL, колись у вимові.txt із зазначенням версії №. і знову явно в dockerfile без специфікації. Видалено запис вимоги.txt. Також спробували збільшити Flask-Admin версія №. догори й донизу. Також спробував очистити міграцію моєї бази даних, оскільки я побачив кілька файлів міграції, які призводять до того, що контейнер не може завантажуватися (правда, це було при використанні SQLite). Зараз є лише один міграційний файл, і на основі сліду стека здається, що це flask db upgradeпрацює чудово.

Одне, що мені ще потрібно спробувати, - це інше базове зображення (менш мінімальне?), Можна спробувати незабаром і оновити це. Але питання для мене настільки загадкове, що я подумав, що настав час запитати, чи хтось ще його бачив:)

Я знайшов цю помилку сокета, яка видалася потенційно актуальною, але вона повинна була повністю виправитись у python 3.8.

Також FYI я пішов за деякі поради тут по кругових імпорту та імпортувати мої адмін функцію контролера всередині create_app.

Докерфайл:

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

Реалізація в 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))

вимоги.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

Коли я запускаю контейнер в інтерактивному терміналі, я бачу такий слід стека:

(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

Мені б хотілося, щоб додаток завантажувалося / обслуговувалося з допомогою gunicorn всередині контейнера, щоб я міг продовжувати розробку зі своєю командою, використовуючи докерську реалізацію та використовуючи докеризований MySQL проти болю локального MySQL для розвитку. Можете порадити?

Відповіді:


7

У вашому Dockerfile:

RUN apk add binutils libc-dev

Це, здається, працює. На жаль, це різко збільшує розмір зображення.
dcart1234

1
Дякую! Я відредагував лише включення бінутилів та libc-dev, зробивши зображення меншими. Я не знаю, що потребує бінутів, але це здається ключовим.
Глина Хардін

3

Так, для Gunicorn 20.0.0 потрібен пакет libc-dev .

Отже, це працює для мене:

RUN apk --no-cache add libc-dev

Я хотів, щоб це спрацювало і спробував спершу (ненавиджу приниження / уточнення явних версій), але це не вдалося: (
Dnelasor

apk add libc-devтеж не працював для мене.
Devy

3

Проблема з gunicorn 20.0.0, відстежена тут: https://github.com/benoitc/gunicorn/isissue/2160

Виправлення виправлено в 20.0.1 і вперед. Отже, змініть це:

RUN venv/bin/pip install gunicorn pymysql

до цього:

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

Якщо оновлення не є варіантом, як вирішення можна додати наступний рядок:

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

На жаль, це додає приблизно 20 Мб до отриманого контейнера докера, але іншого відомого рішення наразі не існує.


2

Здається, ця проблема пов'язана з новою версією Gunicorn 20.0.0. Спробуйте скористатися попереднім 19.9.0


1
python3 ctypes.util.find_library ('c') не працює належним чином у python: alpine
Дмитро Дмитрієв

Так, python3 -c "from ctypes.util import find_library; print(find_library('c'))"повертаєтьсяNone
Devy

0

Я вирішив цю проблему:

  1. Dockerfile: видаліть цю установку "RUN venv / bin / pip install gunicorn"
  2. condition.txt: додайте цей рядок "gunicorn == 19.7.1"

Так. використано 19.9.0 але, yup
Дніласор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.