Cách xử lý 'OSError: không tìm thấy libc' được nêu ra trên Gunicorn exec của ứng dụng Flask bên trong thùng chứa docker của Alpine


13

Tôi đang làm việc trên một ứng dụng Flask dựa trên ứng dụng Microblog từ hướng dẫn lớn của Miguel Grinberg. Mã sống ở đây: https://github.com/dnilasor/quickgig . Tôi có một triển khai docker hoạt động với một thùng chứa MySQL 5.7 được liên kết. Hôm nay tôi đã thêm chức năng Chế độ xem Quản trị bằng mô-đun Flask-Admin. Nó hoạt động tốt được phục vụ cục bộ (OSX) trên máy chủ Flask thông qua 'jar run' nhưng khi tôi xây dựng và chạy hình ảnh docker mới (dựa trên python: 3.8-alpine), nó gặp sự cố khi khởi động với OSError: libc not foundlỗi, mã dường như chỉ ra một thư viện không xác định

Có vẻ như Gunicorn không thể phục vụ ứng dụng theo các bổ sung của tôi. Bạn cùng lớp của tôi và tôi bị bối rối!

Ban đầu tôi đã gặp lỗi khi sử dụng hình ảnh cơ sở python: 3.6-alpine và vì vậy đã thử với 3.7 và 3.8 nhưng không có kết quả. Tôi cũng nhận thấy rằng tôi đã bổ sung thêm PyMySQL, một lần trong yêu cầu chỉ định phiên bản không. và một lần nữa rõ ràng trong dockerfile không có thông số kỹ thuật. Đã xóa mục nhập.txt. Cũng đã thử tăng phiên bản Flask-Admin số. lên và xuống. Cũng đã cố gắng dọn sạch di chuyển cơ sở dữ liệu của tôi vì tôi đã thấy nhiều tệp di chuyển khiến vùng chứa không khởi động được (phải thừa nhận rằng đây là khi sử dụng SQLite). Bây giờ chỉ có một tệp di chuyển duy nhất và dựa trên dấu vết ngăn xếp, có vẻ nhưflask db upgrade công trình chỉ hoạt động tốt.

Một điều tôi chưa thử là một hình ảnh cơ sở khác (ít tối thiểu?), Có thể thử sớm và cập nhật điều này. Nhưng vấn đề này rất bí ẩn đối với tôi đến nỗi tôi nghĩ đã đến lúc hỏi xem có ai khác đã xem nó không :)

Tôi đã tìm thấy lỗi ổ cắm này có vẻ có khả năng liên quan nhưng nó được cho là đã được sửa hoàn toàn trong python 3.8.

Ngoài ra FYI tôi đã làm theo một số lời khuyên ở đây về nhập khẩu tròn và nhập chức năng điều khiển quản trị của tôi vào bên trong 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

Thực hiện trong 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

quản trị viên:

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

Yêu cầu.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

Khi tôi chạy container trong terminal tương tác, tôi thấy dấu vết ngăn xếp sau:

(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

Tôi muốn ứng dụng khởi động / được phục vụ bởi gunicorn bên trong container để tôi có thể tiếp tục phát triển cùng với nhóm của mình bằng cách sử dụng docker và tận dụng MySQL được neo với nỗi đau của MySQL cục bộ để phát triển. Bạn có thể tư vấn?

Câu trả lời:


7

Trong Dockerfile của bạn:

RUN apk add binutils libc-dev

Điều này dường như làm việc. Thật không may, nó làm tăng đáng kể kích thước của hình ảnh.
dcart1234

1
Cảm ơn! Tôi đã chỉnh sửa để chỉ bao gồm binutils và libc-dev, làm cho hình ảnh nhỏ hơn. Tôi không biết những gì cần binutils, nhưng nó dường như là mấu chốt.
Clay Hardin

3

Gunicorn 20.0.0 yêu cầu gói libc-dev .

Vì vậy, điều này làm việc cho tôi:

RUN apk --no-cache add libc-dev

Tôi muốn nó hoạt động và thử nó trước (ghét hạ cấp / chỉ định các phiên bản rõ ràng) nhưng nó đã không: (
Dnilasor

apk add libc-devcũng không làm việc cho tôi.
Devy

3

Đây là sự cố với gunicorn 20.0.0, được theo dõi tại đây: https://github.com/benoitc/gunicorn/issues/2160

Vấn đề được khắc phục trong 20.0.1 và chuyển tiếp. Vì vậy, thay đổi điều này:

RUN venv/bin/pip install gunicorn pymysql

đến đây:

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

Nếu nâng cấp không phải là một tùy chọn, như một cách giải quyết, bạn có thể thêm dòng sau:

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

Thật không may, điều này thêm khoảng 20 MB vào bộ chứa docker kết quả, nhưng không có cách giải quyết nào khác được biết đến vào lúc này.


2

Vấn đề này dường như liên quan đến một phiên bản mới của Gunicorn 20.0.0. Hãy thử sử dụng cái trước 19.9.0


1
python3 ctypes.util.find_l Library ('c') không hoạt động chính xác trong python: alpine
Dmitrii Dmitriev

Đúng, python3 -c "from ctypes.util import find_library; print(find_library('c'))"trở vềNone
Devy

0

Tôi đã giải quyết vấn đề này:

  1. Dockerfile: xóa cài đặt này "RUN venv / bin / pip install gunicorn"
  2. request.txt: thêm dòng này "gunicorn == 19.7.1"

vâng đã sử dụng 19.9.0 nhưng, yup
Dnilasor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.