Я почти уверен, что это вызвано тайм-аутом gunicorn .
Чтобы отключить тайм-аут поведения gunicorn, измените последнюю команду в вашем Dockerfile на:
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app --timeout 0
Где: -- workers 1 --threads 8
означает один рабочий процесс и 8 потоков. (Если вы не укажете ресурсы вручную, по умолчанию будет 1 ядро ЦП). Если вы решите использовать больше ядер, измените рабочие процессы и потоки соответственно, но это немного выходит за рамки данного вопроса.
Важной частью является --timeout 0
, где он в основном предотвращает тайм-аут Gunicorn.
Если вы все еще видите ошибку, то есть одно небольшое дополнение, которое, скорее всего, исправит ее. Также используйте флаг --preload
при запуске стрельбы. Таким образом, последняя команда в Dockerfile будет следующей:
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app --timeout 0 --preload
Это в основном гарантирует, что весь необходимый импорт и предварительная обработка будут выполнены после создания экземпляра, на котором размещен ваш docker контейнер. Это действительно полезно, когда вы работаете с приложениями, которым требуется много времени на одноразовую предварительную обработку. Таким образом, как только приходит запрос, все уже загружено и готово для обслуживания этого запроса.
Чтобы максимизировать преимущества --preload
, вам также необходимо переместить весь импорт et c в самое начало ваше основное приложение и избегайте вызова импорта внутри обработчиков маршрутов.
Кроме того, нет смысла иметь команду точки входа как в app.yaml, так и в Dockerfile. На мой взгляд, лучше оставить его в Dockerfile.
Дополнительно:
Я бы переместил EXPOSE 8080
сразу после строки FROM, так как это обеспечит правильное подключение вашего контейнера к внешний мир.