Werkzeug: 0.15.0 menyebabkan OSError: [Errno 8] Kesalahan format Exec: di Docker untuk Windows

Dibuat pada 21 Mar 2019  ·  19Komentar  ·  Sumber: pallets/werkzeug

0.15.0 baru tidak berjalan di Docker untuk Windows. Belum mencoba Docker di platform lain.

Contoh minimal dengan 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')

file docker

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

persyaratan.txt

# Werkzeug==0.14.1
Flask

Jalankan docker build -t flask_test . dan kemudian docker run flask_test .
Kesalahan dalam wadah:

λ 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

Batalkan komentar pada baris pertama di requirements.txt dan itu berjalan dengan baik setelah dibangun kembali.

Komentar yang paling membantu

Melakukan tutorial yang sama dan menemukan masalah yang sama. Ini memperbaikinya untuk saya.

Saya menambahkan Shebang berikut ke bagian atas skrip app.py saya

#!/usr/local/bin/python3

Yang kemudian menyebabkan masalah izin. Saya kemudian menambahkan yang berikut ini ke Dockerfile saya sebelum CMD

RUN chmod 644 app.py

Semua 19 komentar

Hai masalah yang sama di sini. Diuji pada

  • Centos 7.4 dengan python 3.6
  • Mac OSX 10.14.3 dengan python 3.7

Ini disebabkan oleh perubahan _get_args_for_reloading() di _reloading.py.

Diberikan kode di atas dalam file bernama app.py, dengan cwd() menjadi /home/user/Projects/test/

_get_args_for_reloading() menghasilkan yang berikut:

Dengan 0.14.1 :

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

Dengan 0.15.0

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

Mengawali /home/user/.virtualenvs/test-ChRUEUMK/bin/python ke jalur memang memperbaiki masalah.

@shinuza periksa apakah app.py dapat dieksekusi, jika ya - setel chmod 644 app.py. Atau cara kedua, tambahkan shebang di atas app.py seperti #!/usr/bin/env python

@shinuza ada https://github.com/pallets/werkzeug/blob/0.15.x/src/werkzeug/_reloader.py#L90 baris 90-94 "'/home/user/.virtualenvs/test-ChRUEUMK/bin /python'" telah dihapus jika app.py dapat dieksekusi.
dan OSError: [Errno 8] Kesalahan format Exec: '/usr/src/app/app.py terjadi karena app.py tidak memiliki garis Shebang (https://stackoverflow.com/questions/27606653/oserror-errno- 8-exec-format-error)

@kamyanskiy Saya baru saja menemukan ini dengan membaca kode tetapi kesalahannya harus samar seperti sekarang.

Juga, jika saya secara eksplisit menjalankan python app.py , maka subproses tidak boleh membuat asumsi apa pun dan mengubah cara saya menjalankan aplikasi. yaitu: bekerja dengan mesin virtual dengan folder bersama membuat setiap file dapat dieksekusi secara default.

@shinuza Saya tidak berpikir ini adalah bug kritis, dengan kata lain sekarang sedikit lebih ketat daripada sebelumnya. Jadi saya seharusnya tidak memiliki app.py yang dapat dieksekusi tanpa Shebang, itu tidak masuk akal. Dan kedua saya seharusnya tidak menjalankan executable dengan Shebang seperti "python app.py". Tapi saya setuju, mungkin itu tidak terduga bagi Anda dan bagi saya :) Untuk solusinya, tambahkan saja Shebang ke app.py Anda, saya harap ini akan membantu.

Jika Anda menandai skrip sebagai yang dapat dieksekusi, Anda harus menambahkan komentar juru bahasa yang sesuai ke atas. Anda dapat menggunakan alat seperti kait check-executables-have-shebangs pra-komit untuk menerapkannya.

Jika Anda tidak bermaksud agar skrip dapat langsung dieksekusi, dan ingin meminta python script.py sebagai gantinya, maka Anda tidak boleh menandainya dapat dieksekusi.

Seperti yang saya katakan, saya setuju dengan logika utama di sini. Saya tidak setuju dengan cara kesalahan ditangani serta fakta bahwa pesan kesalahan tidak dapat dipahami kecuali Anda mengetahui detail teknisnya atau membaca kodenya. Setidaknya harus didokumentasikan dalam changelog.

Kami tidak memiliki kendali atas pesan kesalahan, yang berasal dari Linux. Fakta bahwa kami mengubah cara menangani file yang dapat dieksekusi tercantum dalam changelog:

Reloader tidak akan menambahkan Python yang dapat dieksekusi ke baris perintah jika file Python ditandai dapat dieksekusi. Ini memungkinkan reloader bekerja di NixOS. #1242

Membuat file tidak dapat dieksekusi berfungsi. Garis Shebang tidak, bagi saya. Saya mendapatkan file tidak ditemukan kesalahan, sebagai gantinya. Itu hal pertama yang saya coba.

Dengan #!/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

Saya juga berpikir membuat perubahan yang hanya berfungsi pada satu distribusi Linux tetapi merusak sisanya tampaknya tidak ideal. Membuat file tidak dapat dieksekusi sepertinya solusi yang tepat, tetapi ini masih terasa rusak bagi saya.

@penner42 coba #!/usr/bin/env python

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

mungkin Anda tidak memiliki symlink di python3

Hasil yang sama. Symlink python3 ada di sana, dan hanya menjalankan /usr/bin/env python3 atau /usr/bin/env python dari shell berfungsi.

FWIW, Docker memang memberikan peringatan ini saat membangun.
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.

Gunakan perintah 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

Apakah tutorial di https://docs.docker.com/compose/gettingstarted/ dulu berfungsi di Windows 7?
Apakah perubahan terbaru ini menjadi penyebab mengapa saya melihat kesalahan serupa saat mencoba menjalankan contoh:

$ 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

Melakukan tutorial yang sama dan menemukan masalah yang sama. Ini memperbaikinya untuk saya.

Saya menambahkan Shebang berikut ke bagian atas skrip app.py saya

#!/usr/local/bin/python3

Yang kemudian menyebabkan masalah izin. Saya kemudian menambahkan yang berikut ini ke Dockerfile saya sebelum CMD

RUN chmod 644 app.py

Tolong siapa pun dapat memperbarui tutorial (https://docs.docker.com/compose/gettingstarted/)
menambahkan

RUN chmod 644 app.py

Perubahan pada tutorial Docker Compose diusulkan di https://github.com/docker/docker.github.io/pull/8609 .

Diperbaiki di Alat 0.15.5.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat