Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

304
Visualizações
Cómo abordar 'OSError: libc not found' generado en Gunicorn exec de la aplicación Flask dentro del contenedor docker de Alpine

Estoy trabajando en una aplicación Flask basada en la aplicación Microblog del megatutorial de Miguel Grinberg. El código vive aquí: https://github.com/dnilasor/quickgig . Tengo una implementación de Docker en funcionamiento con un contenedor MySQL 5.7 vinculado. Hoy agregué una función de vista de administrador usando el módulo Flask-Admin. Funciona maravillosamente servido localmente (OSX) en el servidor Flask a través de 'flask run' pero cuando construyo y ejecuto la nueva imagen de la ventana acoplable (basada en python: 3.8-alpine), falla al arrancar con un OSError: libc not found , el código para el que parece indicar una biblioteca desconocida

Me parece que Gunicorn no puede servir la aplicación después de mis adiciones. ¡Mi compañero de clase y yo estamos perplejos!

Originalmente recibí el error al usar la imagen base python: 3.6-alpine y probé con 3.7 y 3.8 sin éxito. También noté que estaba agregando PyMySQL de manera redundante, una vez en los requisitos.txt especificando la versión no. y nuevamente explícitamente en el dockerfile sin especificaciones. Se eliminó la entrada de requirements.txt. También intenté incrementar la versión de Flask-Admin no. arriba y abajo. También intenté limpiar las migraciones de mi base de datos, ya que he visto varios archivos de migración que causan que el contenedor no se inicie (es cierto que esto fue cuando usaba SQLite). Ahora solo hay un único archivo de migración y, según el seguimiento de la pila, parece que la flask db upgrade funciona bien.

Una cosa que aún tengo que probar es una imagen base diferente (¿menos mínima?), puedo probar pronto y actualizar esto. Pero el problema es tan misterioso para mí que pensé que era hora de preguntar si alguien más lo había visto :)

Encontré este error de socket que parecía potencialmente relevante, pero se suponía que estaba completamente solucionado en Python 3.8.

También para su información, seguí algunos de los consejos aquí sobre importaciones circulares e importé mi función de controlador de administrador dentro create_app .

archivo acoplable:

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

arranque.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

Implementación en 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

administrador.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))

requisitos.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

Cuando ejecuto el contenedor en la terminal interactiva, veo el siguiente seguimiento de la pila:

 (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

Me gustaría que la aplicación arranque o sea atendida por gunicorn dentro del contenedor para poder seguir desarrollando con mi equipo utilizando la implementación de Docker y aprovechando MySQL dockerizado frente al dolor de MySQL local para el desarrollo. ¿Puedes aconsejarme?

over 4 years ago · Santiago Trujillo
5 Respostas
Responde à pergunta

0

Este problema parece estar relacionado con una nueva versión de Gunicorn 20.0.0. Intenta usar uno anterior 19.9.0

over 4 years ago · Santiago Trujillo Relatório

0

Sí , Gunicorn 20.0.0 requiere el paquete libc-dev .

Así que esto funciona para mí:

 RUN apk --no-cache add libc-dev
over 4 years ago · Santiago Trujillo Relatório

0

He resuelto este problema:

  1. Dockerfile: elimine esta instalación "EJECUTAR venv/bin/pip install gunicorn"
  2. requerimiento.txt: agregue esta línea "gunicorn==19.7.1"
over 4 years ago · Santiago Trujillo Relatório

0

En su Dockerfile:

 RUN apk add binutils libc-dev
over 4 years ago · Santiago Trujillo Relatório

0

Este fue un problema con gunicorn 20.0.0, rastreado aquí: https://github.com/benoitc/gunicorn/issues/2160

El problema se solucionó en 20.0.1 y posteriores. Entonces, cambia esto:

 RUN venv/bin/pip install gunicorn pymysql

a esto:

 RUN venv/bin/pip install 'gunicorn>=20.0.1,<21' pymysql

Si la actualización no es una opción, como solución alternativa, puede agregar la siguiente línea:

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

Desafortunadamente, esto agrega alrededor de 20 MB al contenedor docker resultante, pero no hay ninguna otra solución conocida en este momento.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda