Python 烧瓶和#x27;OSError:[Errno 8]Exec格式错误';当运行docker compose时

Python 烧瓶和#x27;OSError:[Errno 8]Exec格式错误';当运行docker compose时,python,windows,docker,flask,docker-compose,Python,Windows,Docker,Flask,Docker Compose,我正在运行一个烧瓶应用程序。或者无论如何,试着去做 我使用的是Windows 10,应用程序应该在linux Docker容器中运行,并使用以下命令: docker-compose up api command: python manage.py run --host "0.0.0.0" --with-threads Docker compose是版本1.23.2。在dockerfile中,api服务通过以下命令运行: docker-compose up api command: pyth

我正在运行一个烧瓶应用程序。或者无论如何,试着去做

我使用的是Windows 10,应用程序应该在linux Docker容器中运行,并使用以下命令:

docker-compose up api
command: python manage.py run --host "0.0.0.0" --with-threads
Docker compose是
版本1.23.2
。在dockerfile中,
api
服务通过以下命令运行:

docker-compose up api
command: python manage.py run --host "0.0.0.0" --with-threads
当它试图启动时,我看到了一个例外

OSError: [Errno 8] Exec format error: '/api/manage.py'
我最初以为这会是可怕的Windows行结尾,再来找我吧,但在我所有的源文件上运行
dos2unix
并没有解决这个问题

如何避免这个错误


管理.py

导入单击
从flask.cli导入FlaskGroup
从我的应用程序导入api创建应用程序
def创建我的应用程序(信息):
返回创建应用程序()
@单击.group(cls=FlaskGroup,create\u app=create\u my\u app)
def cli():
通过
如果名称=“\uuuuu main\uuuuuuuu”:
cli()
完全回溯

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'
api_1|回溯(最近一次调用):
api|1|文件“manage.py”,第22行
api|1 | cli()
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,第764行,在|调用中__
api|U 1 |返回self.main(*args,**kwargs)
api|1 |文件“/usr/local/lib/python3.6/site-packages/flask/cli.py”,第380行,主要部分
api|返回AppGroup.main(self、*args、**kwargs)
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,第717行,在main中
api|1 | rv=self.invoke(ctx)
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,调用中的第1137行
api_1 |返回_进程_结果(sub_ctx.command.invoke(sub_ctx))
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,调用中的第956行
api_1|返回ctx.invoke(self.callback,**ctx.params)
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,调用中的第555行
api|1 |返回回调(*args,**kwargs)
api|1 |文件“/usr/local/lib/python3.6/site packages/click/decorators.py”,第64行,在新函数中
api|1|返回ctx.invoke(f,obj,*args,**kwargs)
api|1 |文件“/usr/local/lib/python3.6/site packages/click/core.py”,调用中的第555行
api|1 |返回回调(*args,**kwargs)
api|1 |文件“/usr/local/lib/python3.6/site packages/flask/cli.py”,第438行,在run|u命令中
api_1 |使用_调试器=调试器,线程=带_线程)
api|1 |文件“/usr/local/lib/python3.6/site packages/werkzeug/service.py”,第988行,运行简单
api_1 |使用_重载器运行(内部、额外文件、重载器间隔、重载器类型)
api|1 |文件“/usr/local/lib/python3.6/site packages/werkzeug/_reloader.py”,第332行,运行时使用_reloader
api_1 | sys.exit(使用_reloader()重新启动_)
api|1 |文件“/usr/local/lib/python3.6/site packages/werkzeug/_reloader.py”,第176行,在使用_reloader重新启动时
api_1 | exit_code=subprocess.call(args,env=new_environ,close_fds=False)
api|1 |文件“/usr/local/lib/python3.6/subprocess.py”,第287行,在调用中
api|1 |以Popen(*popenargs,**kwargs)作为p:
api|1 |文件“/usr/local/lib/python3.6/subprocess.py”,第729行,在| init中__
api_1 |恢复_信号,启动_新会话)
api|1 |文件“/usr/local/lib/python3.6/subprocess.py”,第1364行,在执行子进程中
api_1 |引发子项_异常_类型(errno_num、err_msg、err_filename)
api_1| OSError:[Errno 8]Exec格式错误:'/api/manage.py'
看起来您的api/manage.py没有shebang(),因此默认(当前)命令处理器(shell-通常是bash)正在尝试运行它,但(显然)失败了

要更正此问题,请添加一个shebang(在文件开头,确保编辑器添加了Nix样式的行结尾(\n0x0ALF):

  • 默认Python安装:

    #/usr/bin/env python
    
    • 变量(显式指定Python 3):

      #/usr/bin/env蟒蛇3
      
  • 自定义Python安装:

    #/完整/path/to/your/custom/python/executable
    
请注意,您还需要文件的exec权限(
chmod+xapi/manage.py

例如:

[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q055271912]>~/sopr.sh
***设置较短的提示,以便粘贴到StackOverflow(或其他)页面时更适合***
[提示]>ls
代码00.py代码01.py
[提示]>
[提示]>cat代码00.py
打印(“这是:,。。。。。。。。)
[prompt]>python3-c“导入操作系统,子流程;子流程.Popen(os.path.join(os.getcwd(),\“code00.py\”)))。通信()”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.6/subprocess.py”,第709行,在__
恢复信号,启动新会话)
文件“/usr/lib/python3.6/subprocess.py”,第1344行,在执行子进程中
引发子项异常类型(错误号、错误消息、错误文件名)
OSError:[Errno 8]Exec格式错误:'/cygdrive/e/Work/Dev/StackOverflow/q055271912/code00.py'
[提示]>
[提示]>cat代码01.py
#!/usr/bin/env蟒蛇3
打印(“这是:,。。。。。。。。)
[prompt]>python3-c“导入操作系统,子流程;子流程.Popen(os.path.join(os.getcwd(),\“code01.py\”)))。通信()”
这是:/cygdrive/e/Work/Dev/StackOverflow/q055271912/code01.py

另一种方法是在文件名后面运行解释器,但我不知道如何从Flask执行-实际上,这需要修补Werkzeug(_reloader.py:_get_args_for_reloading),但这只是一个蹩脚的解决方法(gainarie)-见下文



更新#0 看看@AxelGrytt的答案,它是tu