python - 如何解决 Alpine docker 容器内 Flask 应用程序的 Gunicorn exec 引发的 'OSError: libc not found'

标签 python docker sockets flask gunicorn

我正在开发一个基于 Miguel Grinberg super 教程中的 Microblog 应用程序的 Flask 应用程序。代码在这里:https://github.com/dnilasor/quickgig .我有一个带有链接 MySQL 5.7 容器的工作 docker 实现。今天我使用 Flask-Admin 模块添加了一个管理 View 功能。它通过 'flask run' 在 Flask 服务器上本地 (OSX) 运行良好,但是当我构建并运行新的 docker 镜像(基于 python:3.8-alpine)时,它在启动时崩溃并显示 OSError: libc not found错误,其代码似乎表明 an unknown library

在我看来,Gunicorn 在我添加后无法为该应用程序提供服务。我和同学都懵了!

我最初使用 python:3.6-alpine 基本镜像时遇到了错误,因此尝试使用 3.7 和 3.8 无济于事。我还注意到,我在 requirements.txt 中指定了版本号,一次添加了 PyMySQL。并再次在没有规范的 dockerfile 中明确显示。删除了 requirements.txt 条目。还尝试增加 Flask-Admin 版本号。上和下。还尝试清理我的数据库迁移,因为我看到多个迁移文件导致容器无法启动(诚然,这是在使用 SQLite 时)。现在只有一个迁移文件,根据堆栈跟踪,它似乎是 flask db upgrade工作得很好。

我还没有尝试过的一件事是不同的基本图像(更少?),可以尽快尝试并更新它。但这个问题对我来说太神秘了,我想是时候问问其他人是否看过它了:)

我确实找到了 this socket bug这似乎可能相关,但它应该在 python 3.8 中完全修复。

另外仅供引用,我遵循了一些建议 here关于循环导入并在 create_app 中导入我的管理 Controller 功能.

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:
#!/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

中实现初始化 .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 的痛苦进行开发。你能建议吗?

最佳答案

在您的 Dockerfile 中:

RUN apk add binutils libc-dev

关于python - 如何解决 Alpine docker 容器内 Flask 应用程序的 Gunicorn exec 引发的 'OSError: libc not found',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58786695/

相关文章:

python - 尝试在 Python 3 中将时间转换为整数

python - 过滤日期在多个给定日期的 +/-30 天内的数据

python - 将 Eigen 库与 cppyy 一起使用

字符数组在 UDP 客户端打印随机垃圾

c - read() 返回正值,但 recvline 中没有任何内容

python - 使用 Python 复制和重命名 excel 文件

docker - 如何使用Dockerfile正确构建Spring Boot Docker镜像?

Docker Compose 主机名 DNS 查找失败

reactjs - 部署时无法获取 kubectl 环境变量

java - 无法在开放类次环境中启动 hazelcast。服务器套接字绑定(bind)失败。没有权限