Alpine Dockerコンテナー内のFlaskアプリのGunicorn execで発生した「OSError:libc not found」に対処する方法


13

私はMiguel Grinbergの巨大なチュートリアルのMicroblogアプリに基づいたFlaskアプリケーションに取り組んでいます。コードはここにあります: https //github.com/dnilasor/quickgig。リンクされたMySQL 5.7コンテナを使用して動作するDocker実装があります。今日、Flask-Adminモジュールを使用して管理ビュー機能を追加しました。「flask run」を介してFlaskサーバーのローカル(OSX)で美しく機能しますが、新しいDockerイメージ(python:3.8-alpineに基づく)をビルドして実行すると、ブート時にOSError: libc not foundエラーが発生してクラッシュします。不明なライブラリを示します

追加すると、Gunicornがアプリを提供できないようです。クラスメートと私は困惑しています!

私はもともとpython:3.6-alpineベースイメージを使用してエラーを取得したので、3.7と3.8で試してみたが役に立たなかった。私はまた、PyMySQLを冗長に追加していることに気付きました。そして再び明示的にdockerfileで仕様なしで。requirements.txtエントリを削除しました。また、Flask-Adminのバージョン番号を増やしてみました。上下。また、コンテナーの起動に失敗する原因となる複数の移行ファイルを見たので、データベースの移行をクリーンアップしてみました(確かに、これはSQLiteを使用している場合です)。これで、移行ファイルは1つだけになり、スタックトレースに基づいて、flask db upgrade問題なく動作するように見えます。

私がまだ試していないことの1つは、別のベースイメージ(最小限のものではないですか?)です。すぐに試して、これを更新できます。しかし、この問題は私にとって非常に神秘的であり、他の誰かがそれを見たことがあるかどうか尋ねる時がきたと思った:)

潜在的に関連があるように見えるこのソケットのバグを見つけましたが、Python 3.8で完全に修正されるはずでした。

また、私はここで循環インポートに関するいくつかのアドバイスに従い、内部に管理コントローラー機能をインポートしました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

インタラクティブターミナルでコンテナを実行すると、次のスタックトレースが表示されます。

(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実装を使用し、Docker化されたMySQLを活用して、開発のためにローカルMySQLの苦労を活用してチームで開発を続けることができます。アドバイスしてもらえますか?

回答:


7

Dockerfileで:

RUN apk add binutils libc-dev

これは動作するようです。残念ながら、それは画像のサイズを劇的に増大させます。
dcart1234

1
ありがとう!binutilsとlibc-devだけを含めるように編集して、イメージを小さくしました。binutilsが何を必要としているのかはわかりませんが、極めて重要なようです。
クレイハーディン

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

残念ながら、これにより結果のDockerコンテナーに約20MBが追加されますが、現時点では他の既知の回避策はありません。


2

この問題は、Gunicorn 20.0.0の新しいバージョンに関連しているようです。以前のものを使用してみてください19.9.0


1
python3 ctypes.util.find_library( 'c')がpython:alpineで正しく機能しない
Dmitrii Dmitriev

python3 -c "from ctypes.util import find_library; print(find_library('c'))"None
はい

0

私はこの問題を解決しました:

  1. Dockerfile:このインストール「RUN venv / bin / pip install gunicorn」を削除します
  2. required.txt:この行を追加します "gunicorn == 19.7.1"

うん。19.9.0を使用しましたが、yup
Dnilasor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.