Werkzeug: 0.15.0はOSErrorを引き起こします:[Errno 8] Execフォーマットエラー:DockerforWindowsで

作成日 2019年03月21日  ·  19コメント  ·  ソース: pallets/werkzeug

新しい0.15.0はDockerforWindowsでは動作しません。 他のプラットフォームでDockerを試したことはありません。

Flaskを使用した最小限の例。

app.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello, world!'

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

Dockerfile

FROM python:3-onbuild
COPY . /usr/src/app
CMD ["python", "app.py"]

Requirements.txt

# Werkzeug==0.14.1
Flask

docker build -t flask_test .を実行してから、 docker run flask_testを実行します。
コンテナのエラー:

λ docker run flask_test
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "app.py", line 11, in <module>
    app.run(debug=True, host='0.0.0.0')
  File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 943, in run
    run_simple(host, port, self, **options)
  File "/usr/local/lib/python3.6/site-packages/werkzeug/serving.py", line 988, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
  File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
    sys.exit(reloader.restart_with_reloader())
  File "/usr/local/lib/python3.6/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
    exit_code = subprocess.call(args, env=new_environ, close_fds=False)
  File "/usr/local/lib/python3.6/subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/local/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/usr/local/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: '/usr/src/app/app.py

requirements.txtの最初の行のコメントを解除すると、再構築後に正しく実行されます。

最も参考になるコメント

同じチュートリアルを行い、同じ問題を見つけました。 これで修正されました。

app.pyスクリプトの先頭に次のシバンを追加しました

#!/usr/local/bin/python3

その後、許可の問題が発生しました。 次に、CMDの前にDockerfileに以下を追加しました

RUN chmod 644 app.py

全てのコメント19件

こんにちは同じ問題です。 でテスト済み

  • Centos7.4とPython3.6
  • MacOSX10.14.3とPython3.7

これは、_reloading.pyの_get_args_for_reloading()の変更が原因です。

上記のコードがapp.pyというファイルにあり、cwd()が/home/user/Projects/test/であるとします。

_get_args_for_reloading()は、次のようになります。

0.14.1

['/home/user/.virtualenvs/test-ChRUEUMK/bin/python', 'app.py']

0.15.0

['/home/user/Projects/test/app.py']

パスの前に/home/user/.virtualenvs/test-ChRUEUMK/bin/pythonを付けると、問題は解決します。

@shinuza app.pyが実行可能かどうかを確認し、実行可能であれば、chmod644app.pyを設定します。 または、2番目の方法として、app.pyの上部に#!/ usr / bin /envpythonのようにシバンを追加します。

@shinuza there https://github.com/pallets/werkzeug/blob/0.15.x/src/werkzeug/_reloader.py#L90 lines 90-94 "'/home/user/.virtualenvs/test-ChRUEUMK/bin app.pyが実行可能である場合、/python'"は削除されました。
およびOSError:[Errno 8] Exec形式エラー:'/usr/src/app/app.pyは、app.pyにシバン行がないために発生しました(https://stackoverflow.com/questions/27606653/oserror-errno- 8-exec-format-error)

@kamyanskiyコードを読んでこれを理解したところですが、エラーは今と同じくらい不可解なはずです。

また、明示的にpython app.pyを実行する場合、サブプロセスは仮定を行わず、アプリケーションの実行方法を変更する必要があります。 つまり、共有フォルダを使用して仮想マシンを操作すると、デフォルトですべてのファイルが実行可能になります。

@shinuza重大なバグではないと思います。言い換えれば、以前よりも少し厳しくなりました。 だから私はshebangなしで実行可能なapp.pyを持つべきではありません、それは意味がありません。 次に、「pythonapp.py」のようなshebangで実行可能ファイルを実行するべきではありません。 しかし、私は同意します。おそらくそれは私にとっては予想外でした:)回避策として、app.pyにshebangを追加するだけで、これが役立つことを願っています。

スクリプトを実行可能としてマークする場合は、対応するインタプリタコメントを上部に追加する必要があります。 pre-commitcheck-executables-have-shebangsフックのようなツールを使用してそれを強制できます。

スクリプトを直接実行可能にするつもりがなく、代わりにpython script.pyを要求したい場合は、スクリプトを実行可能としてマークしないでください。

私が言ったように、私はここの主要な論理に同意します。 エラーの処理方法や、技術的な詳細を知っているかコードを読んでいない限り、エラーメッセージが理解できないという事実に同意しません。 少なくとも変更ログに文書化する必要があります。

Linuxからのエラーメッセージを制御することはできません。 実行可能ファイルの処理方法を変更したという事実は、変更ログにリストされています。

Pythonファイルが実行可能とマークされている場合、リローダーはPython実行可能ファイルをコマンドラインの前に追加しません。 これにより、リローダーがNixOSで動作できるようになります。 #1242

ファイルを実行可能にしないようにすることは機能します。 私にとって、シバンラインはそうではありません。 代わりに、ファイルが見つからないというエラーが発生します。 それが私が最初に試したものでした。

#!/usr/bin/env python3

λ docker run flask_test
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
: No such file or directory

また、1つのLinuxディストリビューションでのみ機能するが、残りのディストリビューションを壊すような変更を加えることは理想的ではないと思います。 ファイルを実行可能にしないことは適切な解決策のように思えますが、それでも私には壊れているように感じます。

@ penner42 #!/ usr / bin /envpythonを試してください

root<strong i="7">@4541ebd677e0</strong>:/usr/src/app# ls -la /usr/local/bin/python3
lrwxrwxrwx 1 root staff 9 Mar  4 23:40 /usr/local/bin/python3 -> python3.6
root<strong i="8">@4541ebd677e0</strong>:/usr/src/app# ls -la /usr/local/bin/python 
lrwxrwxrwx 1 root staff 7 Mar  4 23:40 /usr/local/bin/python -> python3

おそらくpython3にシンボリックリンクがありません

同じ結果。 python3シンボリックリンクがあり、シェルから/usr/bin/env python3または/usr/bin/env pythonを実行するだけで機能します。

FWIW、Dockerはビルド時にこの警告を出します。
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

flask runコマンドを使用します。

FROM python:3.7-alpine
WORKDIR /app
ENV FLASK_ENV development
ENV FLASK_APP example
EXPOSE 5000
RUN ["pip", "install", "flask"]
CMD ["flask", "run", "-h", "0.0.0.0"]
docker run --rm -p 5000:5000 -v $(pwd):/app flask/example:latest

https://docs.docker.com/compose/gettingstarted/のチュートリアルは、Windows 7での作業に使用されましたか?
この最近の変更が、例を実行しようとして同様のエラーが表示される原因ですか?

$ docker-compose up
Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
redis_1  | 1:C 27 Mar 2019 17:29:12.746 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 27 Mar 2019 17:29:12.746 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 27 Mar 2019 17:29:12.747 # Warning: no config file specified, using the default config. In order to specify a config file use redis-ser
ver /path/to/redis.conf
redis_1  | 1:M 27 Mar 2019 17:29:12.757 * Running mode=standalone, port=6379.
redis_1  | 1:M 27 Mar 2019 17:29:12.757 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to th
e lower value of 128.
redis_1  | 1:M 27 Mar 2019 17:29:12.758 # Server initialized
redis_1  | 1:M 27 Mar 2019 17:29:12.758 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issu
e add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
web_1    |  * Serving Flask app "app" (lazy loading)
web_1    |  * Environment: production
web_1    |    WARNING: Do not use the development server in a production environment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: on
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1    |  * Restarting with stat
web_1    | Traceback (most recent call last):
web_1    |   File "app.py", line 32, in <module>
web_1    |     app.run(host="0.0.0.0", debug=True)
web_1    |   File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 943, in run
web_1    |     run_simple(host, port, self, **options)
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/serving.py", line 988, in run_simple
web_1    |     run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
web_1    |     sys.exit(reloader.restart_with_reloader())
web_1    |   File "/usr/local/lib/python3.4/site-packages/werkzeug/_reloader.py", line 176, in restart_with_reloader
web_1    |     exit_code = subprocess.call(args, env=new_environ, close_fds=False)
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 534, in call
web_1    |     with Popen(*popenargs, **kwargs) as p:
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 856, in __init__
web_1    |     restore_signals, start_new_session)
web_1    |   File "/usr/local/lib/python3.4/subprocess.py", line 1464, in _execute_child
web_1    |     raise child_exception_type(errno_num, err_msg)
web_1    | OSError: [Errno 8] Exec format error
composetest_web_1 exited with code 1

同じチュートリアルを行い、同じ問題を見つけました。 これで修正されました。

app.pyスクリプトの先頭に次のシバンを追加しました

#!/usr/local/bin/python3

その後、許可の問題が発生しました。 次に、CMDの前にDockerfileに以下を追加しました

RUN chmod 644 app.py

誰でもチュートリアルを更新できます(https://docs.docker.com/compose/gettingstarted/)
たす

RUN chmod 644 app.py

ツール0.15.5で修正されました。

このページは役に立ちましたか?
0 / 5 - 0 評価