วิธีการระบุที่อยู่ 'OSError: ไม่พบ libc' ยกมาจาก Gunicorn exec ของแอพ Flask ภายในคอนเทนเนอร์ Docker Alpine


13

ฉันกำลังทำงานกับแอพพลิเคชั่น Flask โดยใช้แอพ Microblog จากโปรแกรมสอนพิเศษของ Miguel Grinberg รหัสอาศัยอยู่ที่นี่: https://github.com/dnilasor/quickgig ฉันมีการใช้งานนักเทียบท่าที่ใช้งานได้กับคอนเทนเนอร์ MySQL 5.7 ที่เชื่อมโยง วันนี้ฉันได้เพิ่มฟังก์ชั่น Admin View โดยใช้โมดูล Flask-Admin มันใช้งานได้อย่างสวยงามในประเทศ (OSX) บนเซิร์ฟเวอร์ Flask ผ่าน 'flask run' แต่เมื่อฉันสร้างและเรียกใช้อิมเมจ docker ใหม่ (อิงจาก python: 3.8-alpine) มันเกิดข้อผิดพลาดในการบูตพร้อมOSError: libc not foundรหัสข้อผิดพลาด ระบุไลบรารีที่ไม่รู้จัก

ฉันคิดว่า Gunicorn ไม่สามารถให้บริการแอพหลังจากที่ฉันเพิ่มเข้ามา เพื่อนร่วมชั้นของฉันและฉันถูกนิ่งงัน!

ฉันเริ่มมีข้อผิดพลาดในการใช้ภาพหลาม: 3.6 ภาพอัลไพน์ฐานและลองกับ 3.7 และ 3.8 เพื่อประโยชน์ ฉันยังสังเกตเห็นว่าฉันกำลังเพิ่ม PyMySQL ซ้ำซ้อนครั้งหนึ่งใน requirements.txt ซึ่งระบุหมายเลขเวอร์ชัน และอีกครั้งอย่างชัดเจนใน dockerfile โดยไม่มีสเปค ลบรายการ requirements.txt ลองเพิ่มหมายเลขผู้ดูแล Flask ด้วย ขึ้นและลง. และพยายามล้างการโยกย้ายฐานข้อมูลของฉันเนื่องจากฉันเห็นไฟล์การโยกย้ายหลายไฟล์ทำให้คอนเทนเนอร์ไม่สามารถบู๊ตได้ (เป็นที่ยอมรับกันว่านี่คือเมื่อใช้ SQLite) ขณะนี้มีไฟล์การโยกย้ายเพียงไฟล์เดียวและตามการติดตามสแต็กดูเหมือนว่าflask db upgradeทำงานได้ดี

สิ่งหนึ่งที่ฉันยังไม่ได้ลองคืออิมเมจพื้นฐานอื่น (น้อยที่สุดน้อยกว่า) สามารถลองได้ในเร็ว ๆ นี้และอัปเดต แต่ปัญหามันช่างลึกลับเหลือเกินสำหรับฉันที่ฉันคิดว่าถึงเวลาถามว่ามีคนอื่นเห็นหรือเปล่า :)

ฉันพบข้อผิดพลาดซ็อกเก็ตนี้ซึ่งดูเหมือนว่าอาจเกี่ยวข้อง แต่ก็ควรได้รับการแก้ไขอย่างเต็มที่ใน python 3.8

นอกจากนี้ยัง FYI ผมทำตามบางส่วนของคำแนะนำที่นี่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

การติดตั้งใน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))

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

เมื่อฉันเรียกใช้คอนเทนเนอร์ใน terminal แบบโต้ตอบฉันเห็นกองติดตามต่อไปนี้:

(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 ภายในคอนเทนเนอร์เพื่อที่ฉันจะสามารถพัฒนาต่อไปกับทีมของฉันโดยใช้เครื่องมือเทียบท่าและใช้ประโยชน์จาก dockerized MySQL เทียบกับความเจ็บปวดของ MySQL ท้องถิ่นสำหรับการพัฒนา คุณช่วยแนะนำได้ไหม

คำตอบ:


7

ใน Dockerfile ของคุณ:

RUN apk add binutils libc-dev

ดูเหมือนว่าจะใช้งานได้ น่าเสียดายที่มันเพิ่มขนาดของภาพอย่างมาก
dcart1234

1
ขอบคุณ! ฉันแก้ไขเพื่อรวม binutils และ libc-dev ทำให้ภาพเล็กลง ฉันไม่รู้ว่าต้องใช้ binutils อย่างไร แต่มันก็สำคัญมาก
Clay Hardin

3

ใช่Gunicorn 20.0.0ต้องใช้แพคเกจlibc-dev

ดังนั้นนี่เหมาะสำหรับฉัน:

RUN apk --no-cache add libc-dev

ฉันต้องการให้มันทำงานและลองมันก่อน (เกลียดการลดระดับ / การระบุรุ่นที่ชัดเจน) แต่มันก็ไม่ได้: (
Dnilasor

apk add libc-devไม่ได้ผลสำหรับฉันเช่นกัน
Devy

3

นี่เป็นปัญหาของ gunicorn 20.0.0 ติดตามได้ที่นี่: https://github.com/benoitc/gunicorn/issues/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

น่าเสียดายที่นี่เพิ่มประมาณ 20MB ไปยังคอนเทนเนอร์ docker ผลลัพธ์ แต่ไม่มีวิธีแก้ไขอื่น ๆ ที่รู้จักในขณะนี้


2

ดูเหมือนว่าปัญหานี้เกี่ยวข้องกับ Gunicorn 20.0.0 เวอร์ชันใหม่ ลองใช้อันก่อนหน้านี้ 19.9.0


1
python3 ctypes.util.find_library ('c') ทำงานไม่ถูกต้องใน python: อัลไพน์
Dmitrii Dmitriev

ใช่python3 -c "from ctypes.util import find_library; print(find_library('c'))"ผลตอบแทนNone
Devy

0

ฉันได้แก้ไขปัญหานี้แล้ว:

  1. Dockerfile: ลบการติดตั้งนี้ "RUN venv / bin / pip install gunicorn"
  2. requirement.txt: เพิ่มบรรทัดนี้ "gunicorn == 19.7.1"

ได้. ใช้ 19.9.0 แต่ yup
Dnilasor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.