如何处理在Alpine Docker容器中执行Flask应用程序时引发的'OSError: libc not found'错误

2024-03-29 09:40:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个基于miguelgrinberg的mega教程中的微博应用程序的Flask应用程序。代码位于此处:https://github.com/dnilasor/quickgig。我有一个链接MySQL 5.7容器的docker实现。今天我使用Flask管理模块添加了一个管理视图函数。它通过“Flask run”在Flask服务器上本地(OSX)运行效果很好,但是当我构建并运行新的docker映像时(基于Python:3.8-阿尔卑斯山),它在启动时崩溃,并出现OSError: libc not found错误,其代码似乎指示an unknown library

在我看来,Gunicorn无法在我添加的应用程序之后提供服务。我和我的同学被难住了!在

我最初使用Python:3.6-阿尔卑斯山基地试图用图像7.3和so。我还注意到我在冗余地添加PyMySQL要求.txt指定版本号,然后在没有规范的dockerfile中再次显式指定。删除了要求.txt进入。还尝试了增加烧瓶管理版本号上下。我还尝试清理我的数据库迁移,因为我看到多个迁移文件导致容器无法启动(不可否认,这是在使用SQLite时)。现在只有一个迁移文件,根据堆栈跟踪,flask db upgrade似乎可以正常工作。在

我还有一件事要尝试的是一个不同的基本映像(不那么简单?),可以尽快尝试并更新此。但这个问题对我来说太神秘了,我想是时候问问别人有没有看过:)

我确实找到了this socket bug,它似乎有潜在的相关性,但它应该在python3.8中完全修复。在

另外,我还遵循了一些关于循环导入的建议here,并在^{中导入了我的管理控制器函数。在

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"]

在靴子.sh公司名称:

^{pr2}$

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

在管理员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引导/服务,这样我就可以继续与我的团队一起使用docker实现进行开发,并利用dockerized MySQL与本地MySQL的痛苦进行开发。你能给点建议吗?在


Tags: runfrompyimporttxtaddappflask
3条回答

这是gunicorn 20.0.0的问题,跟踪如下: https://github.com/benoitc/gunicorn/issues/2160

该问题已在20.0.1及以后版本中修复。所以,改变这个:

RUN venv/bin/pip install gunicorn pymysql

为此:

^{pr2}$

如果不能选择升级,作为解决方法,可以添加以下行:

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

不幸的是,这会给docker容器增加大约20MB的内存,但是目前还没有其他已知的解决方法。在

在您的Dockerfile中:

RUN apk add binutils libc-dev

是的,gunicorn20.0.0需要libc dev包。在

所以这对我很有用:

RUN apk --no-cache add libc-dev

相关问题 更多 >