8 votes

"OSError: [Errno 8] Erreur de format d'exécution" lors de la tentative d'exécution d'une application Flask simple dans un conteneur Docker

Je suis en train d'essayer de démarrer une application Flask "Hello world" simple dans un conteneur docker mais je continue de recevoir cette erreur : "OSError: [Errno 8] Erreur de format d'exécution : '/app/app.py'"

Mon système d'exploitation hôte est Windows 10.

Mon Dockerfile :

FROM python:3.6

ENV PYTHONBUFFERED 1

ADD . /app

WORKDIR /app

RUN pip install -r requirements.txt

J'ai un requirements.txt avec Flask==1.0.2.

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)

et docker-compose.yml :

version: '3'

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

Journal complet du conteneur :

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 
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] Erreur de format d'exécution : '/app/app.py'
flaskdockerproject_app_1 exited with code 1

MISE À JOUR

Après avoir ajouté le shebang dans app.py comme l'a dit @larsks, je reçois cette erreur : "FileNotFoundError: [Errno 2] Aucun fichier ou dossier de ce type : '/app/app.py' : '/app/app.py'.

Tous les fichiers sont dans le conteneur et au bon endroit.

16voto

Richard Chamberlain Points 191

J'ai rencontré le même problème (erreur de format Exec, puis Fichier introuvable si j'ajoutais le shebang).

Ajouter "RUN chmod 644 app.py" au Dockerfile l'a corrigé pour moi, comme mentionné ici : https://github.com/pallets/werkzeug/issues/1482

5voto

Mr. Vanderstelt Points 126

Passé toute la journée hier à assembler les pièces de ce problème, forum par forum, donc je veux partager une réponse plus détaillée à cette question. En construisant mon image, j'ai également vu le message d'avertissement suivant :

AVERTISSEMENT DE SÉCURITÉ : Vous construisez une image Docker à partir de Windows sur un hôte Docker non-Windows.

"Cet avertissement a été ajouté, car le système de fichiers Windows n'a pas d'option pour marquer un fichier comme 'exécutable'. Construire une image linux à partir d'une machine Windows casserait donc l'image si un fichier doit être marqué comme exécutable." - https://github.com/moby/moby/issues/20397

Donc, comme le souligne Richard Chamberlain dans le commentaire ci-dessus, en ajoutant "RUN chmod 644.py" assure que le fichier app.py est correctement marqué.

En mettant toutes les pièces ensemble, voici le Dockerfile complet qui a fonctionné pour moi - J'espère vraiment que cela aidera la prochaine personne qui lutte avec ce problème!

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"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X