我正在基于Miguel Grinberg的大型教程的microblog应用程序开发flask应用程序。代码位于此处:https://github.com/dnilasor/quickgig。我有一个带有链接的MySQL 5.7容器的工作docker实现。今天,我使用flask-Admin模块添加了一个Admin View功能。它通过“烧瓶运行”在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
中。
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实现与团队合作,并利用dockerized MySQL和本地MySQL进行开发的痛苦。你能建议吗?