python3: не удается найти модуль __main__ в app.py - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать контейнер Docker, чтобы иметь возможность создать графический интерфейс с Flask для использования модели тензорного потока.Дело в том, что я хотел бы иметь возможность изменять мои файлы Python в режиме реального времени, и мне не нужно каждый раз перестраивать свой контейнер.

Итак, на данный момент я создал 3 файла:

требование.txt

Flask
tensorflow
keras

Dockerfile

# Use an official Python runtime as a parent image
FROM python:3.5.6-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python3", "app.py"]

app.py

from flask import Flask
import os
import socket

app = Flask(__name__)

@app.route("/")
def test():
html = "<h3>Hello {name}!</h3>" \
       "<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

Поэтому после всего этого я создаю свой контейнер с помощью этой команды

docker build -t modelgui .

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

docker run -p 4000:80 -v /home/Documents/modelGUI:/app modelgui

Но я получаю эту ошибку, и ядействительно не знаю, почему

/usr/local/bin/python3: can't find '__main__' module in 'app.py'

Моя проблема может быть глупой, но я действительно застрял здесь.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Убедитесь, что / home / Documents / modelGUI в монтируемом томе bind - это путь к файлам кода, а app.py по этому пути не создан каккаталог, а не файл python с кодом, который вы намереваетесь запустить.

Если app.py в / home / Documents / modelGUI является каталогом, то причинаэтой проблемы является то, что вы вообще не вызываете ваш скрипт app.py , вы просто даете интерпретатору Python несуществующее имя скрипта, которое в случае, если существует каталог с аналогичным именем (фактически не чувствительный к регистру), он пытаетсячтобы выполнить его.

Я попытался повторить:

$ ls -lFs
Dockerfile
app.py/
requirements.txt

Затем вызвал интерпретатор Python с app.py :

$ python3 app.py
/usr/local/bin/python3: can't find '__main__' module in 'app.py'
0 голосов
/ 24 августа 2018

Запуск этого локально, похоже, что монтирование вашего тома перезаписывает ваш каталог:

Нет тома

docker run -it test_image bash
root@c3870b9845c3:/app# ls
Dockerfile  app.py  requirements.txt
root@c3870b9845c3:/app# python app.py
 * 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: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

С томом

docker run -it -v ~/Barings_VSTS/modelGUI:/app test_image bash
root@f6349f899079:/app# ls
somefile.txt
root@f6349f899079:/app#

Это может быть частьювопроса.Если вы хотите смонтировать файловую систему, я бы смонтировал ее в другой каталог.Поведение тома по умолчанию таково, что все, что вы скопировали в app, будет перезаписано содержимым modelGUI

...