Привет, ЛОР. С наступившим! Пусть он принесет меньше кринжа и бугуртов, больше флекса и чила.
Осваиваю контейнеры, чтобы всем говорить о том, насколько они не нужны. Упёрся в как будто бы простую проблему, но решить её не получается.
Делаю по старому туториалу и , полагаю, что до сих пор должно работать.
Есть приложение на питоне:
my_module.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Connected as volume!\n'
и testapp.py
from my_module import app as application
if __name__ == '__main__':
application.run(debug=True,host='0.0.0.0')
Собираю образ.
Dockerfile
FROM python:3.4
RUN pip install Flask==0.10.1 https://github.com/unbit/uwsgi/archive/uwsgi-2.0.zip#egg=uwsgi
Workdir /app
Copy app /app
CMD ["uwsgi","--http", "0.0.0.0:9000", "--wsgi-file", "/app/testapp.py", "--callable",\
"app", "--stats", "0.0.0.0:9001"]
Образ создается без ошибок, всё красиво.
Запускаю образ
docker run --rm -d -p 9000:9000 -p 9001:9001 testapp
и теперь ожидаю, что на портах 9000 и 9001 локалхоста будет ответ от WSGI, однако там Internal server error. То есть сам сервер работает, но питоновский скрипт нет. В логах контейнера вижу:
*** Operational MODE: single process ***
unable to find "application" callable in file /app/testapp.py
unable to load app 0 (mountpoint='') (callable not found or import error)
Соответственно, при запросах к серваку, ругается, что питоновской проги не найдено
--- no python application found, check your startup logs for errors ---
Полагаю, что именно в этом и заключается проблема, но как её победить не знаю и прошу помощи. Кстати, разнести скрипт на основной и модуль мне подсказал гугол ( если модуль прям в основную программу запихнуть - тоже не работает), типа WSGI ожидает увидеть моё application в качестве переменной.
Щито делать то (ну кроме самовыпила с лора)?