烧瓶 CLI 在通过文档撰写运行时引发 "OSError: [Errno 8] Exec 格式错误"

共2个回答,已解决, 标签: python windows docker flask docker-compose

我正在运行一个带有自定义脚本的装瓶应用程序。或者试图, 反正。

我在 Windows 10 上, 应用程序应该在带有以下命令的 linux Docker 容器中运行:

docker-compose up api

船坞是 version 1.23.2 。在 docker 文件中, api 服务通过以下命令运行:

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

当它试图启动时, 我看到了例外

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

我最初以为这将是可怕的 Windows 行结束, 来找我一次, 但 dos2unix 在我所有的源文件上运行还没有解决问题。

如何避免此错误?


管理。

    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
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          |
第1个答案(采用)

看起来你的/apiamyp . py 没有Shebang ([维基百科]: shebang (unix)), 所以默认 (当前) 命令处理器 (shell-通常 bash) 试图运行它, 这 (显然) 失败了。

若要更正此问题, 请添加一个 shebang (在文件的开头):

#!/usr/bin/env python3

或:

#!/full/path/to/your/custom/python/executable

请注意, 您还需要对该文件 ( chmod +x /api/manage.py ) 的执行权限。

例子:

[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q055271912]> ~/sopr.sh
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> ls
code0.py  code1.py
[prompt]>
[prompt]> cat code0.py
print("This is:", file)
[prompt]> python3 -c "import os, subprocess;subprocess.Popen(os.path.join(os.getcwd(), "code0.py")).communicate()"
Traceback (most recent call last):
  File "", line 1, in
  File "/usr/lib/python3.6/subprocess.py", line 709, in init
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/cygdrive/e/Work/Dev/StackOverflow/q055271912/code0.py'
[prompt]>
[prompt]> cat code1.py
#!/usr/bin/env python3
print("This is:", file)

另一种方法是运行解释器, 然后是文件名, 但我不知道如何从瓶中执行。

第2个答案

沃克泽格 0.15.1 和码头工人有一个虫子。把它降级到 werkzeug==0.14.1 对我很管用。

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 带有 maven 的 Java 不会构建: 无法运行程序 “cmd” “格式错误的参数嵌入了引用” Time.sleep (..) 准确性会改变并影响循环性能,这取决于不同的进程 (Chrome) 是否正在运行 在 “长路径感知” 环境中对 PathRelativePathTo 参数的限制 MSBuild 未处理异常: 除非设置了 UseShellExecute,否则 FileName 属性不应是目录 如何解决 Alpine docker 容器内烧瓶应用 Gunicorn exec 上提出的 “oserror: libc 未找到” 缺少 inotify 事件 (在。Git 目录 选择烧瓶后不显示下拉选择值? 烧瓶和 Keras 模型错误 ''_ thread._ local '对象没有属性' value' '? 烧瓶 CLI 在通过文档撰写运行时引发 "OSError: [Errno 8] Exec 格式错误" E: 在使用 docker compose 的 php-fpm 映像构建中,包 “mysql-client” 没有安装候选 React: 找不到模块: 无法解析 “React-html-parser”