postgres - python3 flask docker




Flask CLI lança 'OSError:[Errno 8] Erro de formato Exec' quando executado por meio do docker-compose (3)

A resposta de @CristiFati funcionou para mim com 1 passo adicional:

Eu também tive que corrigir o EOL de \r\n para \n .

Desculpe, não tenho pontos suficientes para adicionar um comentário e tenho que abrir uma nova resposta ...

Estou executando um aplicativo Flask com um script personalizado . Ou tentando, de qualquer maneira.

Estou no Windows 10 e o aplicativo deve ser executado em um contêiner do Docker do Linux com o comando:

docker-compose up api

Docker-compose é a version 1.23.2 . No dockerfile, o serviço da api é executado por meio do comando:

command: python manage.py run --host "0.0.0.0" --with-threads

Enquanto tenta iniciar, vejo a exceção

OSError: [Errno 8] Exec format error: '/api/manage.py'

Eu inicialmente pensei que isso seria o Dreaded Windows Line Endings, venha para mim mais uma vez, mas executando dos2unix em todos os meus arquivos de origem não resolveu o problema.

Como posso evitar esse erro?

manage.py

    import click
    from flask.cli import FlaskGroup

    from my_app_api import create_app


    def create_my_app(info):
        return create_app()


    @click.group(cls=FlaskGroup, create_app=create_my_app)
    def cli():
        pass


    if __name__ == "__main__":
        cli()

Rastreamento completo

api_1          | Traceback (most recent call last):
api_1          |   File "manage.py", line 22, in <module>
api_1          |     cli()
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 764, in __call__
api_1          |     return self.main(*args, **kwargs)
api_1          |   File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 380, in main
api_1          |     return AppGroup.main(self, *args, **kwargs)
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 717, in main
api_1          |     rv = self.invoke(ctx)
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
api_1          |     return _process_result(sub_ctx.command.invoke(sub_ctx))
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 956, in invoke
api_1          |     return ctx.invoke(self.callback, **ctx.params)
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 555, in invoke
api_1          |     return callback(*args, **kwargs)
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
api_1          |     return ctx.invoke(f, obj, *args, **kwargs)
api_1          |   File "/usr/local/lib/python3.6/site-packages/click/core.py", line 555, in invoke
api_1          |     return callback(*args, **kwargs)
api_1          |   File "/usr/local/lib/python3.6/site-packages/flask/cli.py", line 438, in run_command
api_1          |     use_debugger=debugger, threaded=with_threads)
api_1          |   File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple
api_1          |     run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
api_1          |   File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
api_1          |     sys.exit(reloader.restart_with_reloader())
api_1          |   File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
api_1          |     exit_code = subprocess.call(args, env=new_environ, close_fds=False)
api_1          |   File "/usr/local/lib/python3.6/subprocess.py", line 287, in call
api_1          |     with Popen(*popenargs, **kwargs) as p:
api_1          |   File "/usr/local/lib/python3.6/subprocess.py", line 729, in __init__
api_1          |     restore_signals, start_new_session)
api_1          |   File "/usr/local/lib/python3.6/subprocess.py", line 1364, in _execute_child
api_1          |     raise child_exception_type(errno_num, err_msg, err_filename)
api_1          | OSError: [Errno 8] Exec format error: '/api/manage.py'

Este é um novo comportamento em Werkzeug 0.15. O downgrade para o Werkzeug 0.14.1 pode funcionar, mas o 0.14 não é mais suportado, então é melhor você corrigir o problema com o arquivo, conforme descrito nas outras respostas.


Se você desabilitar o modo de depuração (não passar debug=True ou definir FLASK_DEBUG=0 ), o recarregador não será usado e, portanto, esse problema não ocorrerá. A desvantagem é que você não tem mais o recarregador.

if __name__ == "__main__":
    connexion_app.run(host="0.0.0.0", port=constants.API_PORT, debug=True)

É preferível consertar isso garantindo que os arquivos marcados como executáveis ​​tenham uma linha de intérprete, como #!/usr/bin/env python3 (de share ).