«OSError: [Errno 8] Exec format error» при попытке запустить простое приложение фляги в контейнере докера - PullRequest
8 голосов
/ 23 марта 2019

Я пытаюсь запустить простое приложение Flask "Hello world" в контейнере Docker, но постоянно получаю эту ошибку: "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

У меня файл needs.txt с Flask == 1.0.2.

приложением.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

ОБНОВЛЕНИЕ

ПослеЯ добавил shebang в app.py, как @larsks сказал, что я получаю эту ошибку: "FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/app/app.py': '/app/app.py'.

Все файлы находятся в контейнере и в нужном месте.

Ответы [ 2 ]

15 голосов
/ 26 марта 2019

Я столкнулся с той же проблемой (ошибка формата Exec, затем FileNotFound, если я добавил shebang).

Добавление "RUN chmod 644 app.py" в Dockerfile исправило это для меня, как упоминалось здесь: https://github.com/pallets/werkzeug/issues/1482

5 голосов
/ 12 апреля 2019

Вчера потратил целый день, собирая кусочки по этой проблеме, форум за форумом, поэтому я хочу поделиться более подробным ответом на этот вопрос.При создании своего образа я также видел следующее предупреждающее сообщение:

ПРЕДУПРЕЖДЕНИЕ БЕЗОПАСНОСТИ: Вы создаете образ Docker из Windows на хосте, отличном от Windows.

«Это предупреждение было добавлено, поскольку файловая система Windows не имеет возможности пометить файл как« исполняемый ». Поэтому создание образа linux на компьютере с Windows нарушит его, если файл должен быть помечен как исполняемый».- https://github.com/moby/moby/issues/20397

Итак, как заметил Ричард Чемберлен в комментарии выше, добавление «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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...