我正在运行带有 Custom Script 的 Flask 应用程序。或尝试,无论如何。
我在 Windows 10 上,应用程序应该使用以下命令在 linux Docker 容器中运行:
docker-compose up api
Docker-compose 是 version 1.23.2
。在 dockerfile 中, 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
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()
完整追溯
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'
原文由 tessafyi 发布,翻译遵循 CC BY-SA 4.0 许可协议
看起来你的 api/manage.py 没有 shebang ( [Wikipedia]: Shebang (Unix) ),所以默认的(当前的)命令处理器(一个 shell - 通常是 bash )正在尝试运行它,这(很明显)失败。
要更正此问题,请添加一个 shebang (在文件的开头,确保您的编辑器添加了 Nix 样式的行结尾( \n 、 0x0A 、 LF )):
变体(明确指定 Python 3 ):
自定义 Python 安装:
请注意,您还需要文件的执行权限 (---
chmod +x api/manage.py
)。例子:
根据 Werkzeug 作者的说法,从现在开始, 这是期望的行为(也适用于 v 0.15.2 ):