Die neue 0.15.0 lĂ€uft nicht in Docker fĂŒr Windows. Habe Docker auf anderen Plattformen nicht ausprobiert.
Minimalbeispiel mit 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"]
Anforderungen.txt
# Werkzeug==0.14.1
Flask
FĂŒhren Sie docker build -t flask_test .
und dann docker run flask_test
.
Fehler im BehÀlter:
λ 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
Entkommentieren Sie die erste Zeile in requirements.txt
und es lĂ€uft nach dem Neuaufbau ordnungsgemĂ€Ă.
Hallo gleiches Problem hier. Getestet auf
Dies wird durch die Ănderungen in _get_args_for_reloading()
in _reloading.py verursacht.
Gegeben ist der obige Code in einer Datei namens app.py, wobei cwd() /home/user/Projects/test/
ist
_get_args_for_reloading()
ergibt Folgendes:
Mit 0.14.1
:
['/home/user/.virtualenvs/test-ChRUEUMK/bin/python', 'app.py']
Mit 0.15.0
['/home/user/Projects/test/app.py']
Das Voranstellen /home/user/.virtualenvs/test-ChRUEUMK/bin/python
an den Pfad behebt das Problem.
@shinuza prĂŒfen, ob app.py ausfĂŒhrbar ist, wenn ja - chmod 644 app.py setzen. Oder zweitens, fĂŒgen Sie Shebang oben auf app.py hinzu, wie #!/usr/bin/env python
@shinuza dort https://github.com/pallets/werkzeug/blob/0.15.x/src/werkzeug/_reloader.py#L90 Zeilen 90-94 die â/home/user/.virtualenvs/test-ChRUEUMK/bin /python'" wurde entfernt, wenn app.py ausfĂŒhrbar ist.
und OSError: [Errno 8] Exec-Formatfehler: '/usr/src/app/app.py passierte, weil app.py keine Shebang-Zeile hat (https://stackoverflow.com/questions/27606653/oserror-errno- 8-Exec-Format-Fehler)
@kamyanskiy Ich habe das gerade beim Lesen des Codes herausgefunden, aber der Fehler sollte so kryptisch sein wie jetzt.
Wenn ich explizit python app.py
ausfĂŒhre, sollte der Unterprozess keine Annahmen treffen und die Art und Weise Ă€ndern, wie ich die Anwendung ausfĂŒhre. dh: Das Arbeiten mit einer virtuellen Maschine mit freigegebenem Ordner macht alle Dateien standardmĂ€Ăig ausfĂŒhrbar.
@shinuza Ich denke nicht, dass es ein kritischer Fehler ist, mit anderen Worten, es ist jetzt etwas strenger als zuvor. Also sollte ich keine ausfĂŒhrbare app.py ohne Shebang haben, es macht keinen Sinn. Und zweitens sollte ich keine ausfĂŒhrbare Datei mit Shebang wie "python app.py" ausfĂŒhren. Aber ich stimme zu, wahrscheinlich war das fĂŒr Sie wie fĂŒr mich unerwartet :) Um dies zu umgehen, fĂŒgen Sie einfach Shebang zu Ihrer app.py hinzu, ich hoffe, das wird helfen.
Wenn Sie ein Skript als ausfĂŒhrbar markieren, sollten Sie oben einen entsprechenden Interpreter-Kommentar hinzufĂŒgen. Sie können ein Tool wie den Hook check-executables-have-shebangs
pre-commit verwenden, um dies zu erzwingen.
Wenn Sie nicht beabsichtigen, dass ein Skript direkt ausfĂŒhrbar ist, und stattdessen python script.py
benötigen, sollten Sie es nicht als ausfĂŒhrbar markieren.
Wie gesagt, ich stimme hier der Hauptlogik zu. Ich bin nicht einverstanden mit der Art und Weise, wie mit dem Fehler umgegangen wird, sowie mit der Tatsache, dass die Fehlermeldung unverstÀndlich ist, es sei denn, Sie kennen die technischen Details oder lesen den Code. Es sollte zumindest im Changelog dokumentiert sein.
Wir haben keinen Einfluss auf die Fehlermeldung, die von Linux kommt. Die Tatsache, dass wir den Umgang mit ausfĂŒhrbaren Dateien geĂ€ndert haben, ist im Ănderungsprotokoll aufgefĂŒhrt:
Der Reloader stellt die ausfĂŒhrbare Python-Datei nicht der Befehlszeile voran, wenn die Python-Datei als ausfĂŒhrbar markiert ist. Dadurch kann der Reloader unter NixOS arbeiten. #1242
Die Datei nicht ausfĂŒhrbar machen funktioniert. Die Shebang-Linie tut es fĂŒr mich nicht. Stattdessen erhalte ich Datei nicht gefunden-Fehler. Das war das erste, was ich versuchte.
Mit #!/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
Ich denke auch, dass eine Ănderung, die nur auf einer Linux-Distribution funktioniert, aber den Rest kaputt macht, nicht ideal erscheint. Die Dateien nicht ausfĂŒhrbar zu machen, scheint die richtige Lösung zu sein, aber das fĂŒhlt sich fĂŒr mich immer noch kaputt an.
@penner42 versuchen Sie #!/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
Wahrscheinlich haben Sie keinen Symlink auf Python3
Gleiches Ergebnis. Der python3-Symlink ist da, und es funktioniert einfach, /usr/bin/env python3
oder /usr/bin/env python
von einer Shell aus auszufĂŒhren.
FWIW, Docker gibt diese Warnung beim Erstellen aus.
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.
Verwenden Sie den Befehl 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
Hat das Tutorial unter https://docs.docker.com/compose/gettingstarted/ unter Windows 7 funktioniert?
Ist diese kĂŒrzliche Ănderung die Ursache, warum ich beim Versuch, das Beispiel auszufĂŒhren, einen Ă€hnlichen Fehler sehe:
$ 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
Habe das gleiche Tutorial gemacht und das gleiche Problem festgestellt. Dies hat es fĂŒr mich behoben.
Ich habe den folgenden Kram am Anfang meines app.py
-Skripts hinzugefĂŒgt
#!/usr/local/bin/python3
Was dann zu Berechtigungsproblemen fĂŒhrte. Ich habe dann Folgendes zu meinem Dockerfile
vor dem CMD hinzugefĂŒgt
RUN chmod 644 app.py
Bitte jeder kann das Tutorial aktualisieren (https://docs.docker.com/compose/gettingstarted/)
hinzufĂŒgen
RUN chmod 644 app.py
Ănderungen am Docker Compose-Tutorial, vorgeschlagen in https://github.com/docker/docker.github.io/pull/8609.
Fixed in Werkzeug 0.15.5.
Hilfreichster Kommentar
Habe das gleiche Tutorial gemacht und das gleiche Problem festgestellt. Dies hat es fĂŒr mich behoben.
Ich habe den folgenden Kram am Anfang meines
app.py
-Skripts hinzugefĂŒgt#!/usr/local/bin/python3
Was dann zu Berechtigungsproblemen fĂŒhrte. Ich habe dann Folgendes zu meinem
Dockerfile
vor dem CMD hinzugefĂŒgtRUN chmod 644 app.py