알파인 도커 컨테이너 내 플라스크 앱의 Gunicorn exec에서 발생하는 'OSError : libc not found'해결 방법


13

Miguel Grinberg의 초대형 튜토리얼의 Microblog 앱을 기반으로 한 Flask 응용 프로그램을 만들고 있습니다. 코드는 https://github.com/dnilasor/quickgig에 있습니다. 연결된 MySQL 5.7 컨테이너로 작동하는 도커 구현이 있습니다. 오늘 저는 Flask-Admin 모듈을 사용하여 Admin View 기능을 추가했습니다. 'flask run'을 통해 Flask 서버에서 로컬 (OSX)로 아름답게 작동하지만 새로운 docker 이미지 (python : 3.8-alpine 기반)를 빌드하고 실행할 때 OSError: libc not found오류 가 발생하여 부팅시 충돌이 발생 합니다. 알 수없는 라이브러리를 나타냅니다

Gunicorn이 추가 한 후에 앱을 제공 할 수없는 것 같습니다. 나의 반 친구와 나는 혼란에 빠졌다!

원래 python : 3.6-alpine 기본 이미지를 사용하여 오류가 발생하여 3.7 및 3.8로 시도했지만 아무 소용이 없었습니다. 또한 버전 번호를 지정하여 requirements.txt에 PyMySQL을 한 번에 추가하는 것으로 나타났습니다. 사양없이 도커 파일에서 명시 적으로 다시. requirements.txt 항목을 제거했습니다. 또한 Flask-Admin 버전 번호를 늘려 보았습니다. 위아래로. 또한 컨테이너가 부팅되지 않는 여러 마이그레이션 파일을 보았으므로 데이터베이스 마이그레이션을 정리하려고 시도했습니다 (SQLite를 사용하는 경우였습니다). 이제 단일 마이그레이션 파일 만 있으며 스택 추적을 기반으로 flask db upgrade작동 하는 것처럼 보입니다 .

아직 시도하지 않은 한 가지는 다른 기본 이미지 (최소한?)이며 곧 시도하여 업데이트 할 수 있습니다. 그러나이 문제는 나에게 신비로 워서 다른 누군가가 그것을 보았는지 물어볼 시간이라고 생각했습니다. :)

잠재적으로 관련 있는 것으로 보이는 이 소켓 버그 를 발견 했지만 파이썬 3.8에서 완전히 수정되어야합니다.

또한 참고로 나는 충고의 일부를 따라 여기에 원형 수입에 내 관리 컨트롤러 기능 내부를 가져옵니다 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))

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

대화 형 터미널에서 컨테이너를 실행하면 다음 스택 추적이 표시됩니다.

(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이 앱을 부팅 / 제공하고 싶습니다. 따라서 docker 구현을 사용하여 팀과 함께 개발하고 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가 추가되지만 현재 알려진 다른 해결 방법은 없습니다.


2

이 문제는 Gunicorn 20.0.0의 새 버전과 관련이있는 것 같습니다. 이전 19.9.0을 사용해보십시오


1
python3의 ctypes.util.find_library ( 'C')는 파이썬에서 제대로 작동하지 않습니다 고산
Dmitrii 드미트리

python3 -c "from ctypes.util import find_library; print(find_library('c'))"None
그렇습니다

0

이 문제를 해결했습니다.

  1. Dockerfile :이 설치 제거 "RUN venv / bin / pip install gunicorn"
  2. requirements.txt :이 줄 "gunicorn == 19.7.1"추가

예. 그래, 19.9.0을 사용하지만
Dnilasor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.