【问题标题】:"OSError: [Errno 8] Exec format error" when trying to run simple flask app in a docker container尝试在 docker 容器中运行简单的烧瓶应用程序时出现“OSError:[Errno 8] Exec 格式错误”
【发布时间】:2019-08-14 08:30:33
【问题描述】:

我正在尝试在 docker 容器中启动一个简单的 Flask“Hello world”应用程序,但我不断收到此错误:“OSError: [Errno 8] Exec format error: '/app/app.py'”

我的主机操作系统是 Windows 10。

我的 Dockerfile:

FROM python:3.6

ENV PYTHONBUFFERED 1

ADD . /app

WORKDIR /app

RUN pip install -r requirements.txt

我有 Flask==1.0.2 的 requirements.txt。

app.py:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

和 docker-compose.yml:

version: '3'

services:
  app:
    build: .
    command: python app.py
    ports:
      - "8000:8000"

容器的整个日志:

app_1  |  * Serving Flask app "app" (lazy loading)
app_1  |  * Environment: production
app_1  |    WARNING: Do not use the development server in a production environment.
app_1  |    Use a production WSGI server instead.
app_1  |  * Debug mode: on
app_1  |  * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
app_1  |  * Restarting with stat
app_1  | Traceback (most recent call last):
app_1  |   File "app.py", line 9, in <module>
app_1  |     app.run(host='0.0.0.0', port=8000, debug=True)
app_1  |   File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 943, in run
app_1  |     run_simple(host, port, self, **options)
app_1  |   File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple
app_1  |     run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
app_1  |   File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
app_1  |     sys.exit(reloader.restart_with_reloader())
app_1  |   File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
app_1  |     exit_code = subprocess.call(args, env=new_environ, close_fds=False)
app_1  |   File "/usr/local/lib/python3.6/subprocess.py", line 287, in call
app_1  |     with Popen(*popenargs, **kwargs) as p:
app_1  |   File "/usr/local/lib/python3.6/subprocess.py", line 729, in __init__
app_1  |     restore_signals, start_new_session)
app_1  |   File "/usr/local/lib/python3.6/subprocess.py", line 1364, in _execute_child
app_1  |     raise child_exception_type(errno_num, err_msg, err_filename)
app_1  | OSError: [Errno 8] Exec format error: '/app/app.py'
flaskdockerproject_app_1 exited with code 1

更新

在我在 app.py 中添加 shebang 之后,就像@larsks 说的那样,我收到了这个错误: "FileNotFoundError: [Errno 2] 没有这样的文件或目录:'/app/app.py': '/app/app.py'。

所有文件都在容器中并且在正确的位置。

【问题讨论】:

  • 如果将适当的 shebang 行添加到 Python 脚本(例如 #!/usr/local/bin/python3)会发生什么?
  • @larsks 我用不同的 shebang "#!/usr/bin/env python" 尝试过,但得到了这个错误:"/usr/bin/env: 'python3\r': No such file或目录”。但是现在当我添加你的 shebang 时,它实际上是在说“FileNotFoundError: [Errno 2] No such file or directory: '/app/app.py': '/app/app.py'”

标签: docker flask


【解决方案1】:

我遇到了同样的问题(执行格式错误,如果我添加了 shebang,则为 FileNotFound)。

将“RUN chmod 644 app.py”添加到 Dockerfile 为我修复了它,如下所述:https://github.com/pallets/werkzeug/issues/1482

【讨论】:

    【解决方案2】:

    昨天花了一整天的时间在这个问题上拼凑起来,一个论坛一个论坛,所以我想分享这个问题的更详细的答案。在构建图像时,我还看到了以下警告消息:

    安全警告:您正在从 Windows 针对非 Windows Docker 主机构建 Docker 映像。

    “添加了该警告,因为 Windows 文件系统没有将文件标记为“可执行”的选项。因此,如果必须将文件标记为可执行文件,则从 Windows 机器构建 linux 映像会破坏映像。” - https://github.com/moby/moby/issues/20397

    因此,正如 Richard Chamberlain 在上面的评论中指出的那样,添加“RUN chmod 644.py”可确保 app.py 文件被正确标记。

    将所有部分放在一起,这是对我有用的完整 Dockerfile - 真的希望它可以帮助下一个人在这个问题上苦苦挣扎!

    FROM python:3.7-alpine
    COPY . /app
    WORKDIR /app
    RUN apk add --no-cache --virtual .build-deps \
        ca-certificates gcc postgresql-dev linux-headers musl-dev \
        libffi-dev jpeg-dev zlib-dev \
        && pip install --no-cache -r requirements.txt
    RUN chmod 644 app.py
    CMD ["python","app.py"]
    

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2016-12-14
      • 2021-06-10
      • 2016-12-31
      • 2016-04-15
      • 2021-01-20
      • 2016-07-08
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多