Развертывание Django в гибкой среде App Engine — ответ об ошибке тайм-аута: [4]

Я пытаюсь развернуть свое приложение в гибкой среде. Образ Docker строится нормально, но процесс завершается сбоем, когда я думаю, что он пытается запустить службу. Мой тайм-аут сборки установлен на 1200, чего бы это ни стоило.

Как мне дальше исследовать эту ошибку? Я изо всех сил пытаюсь найти, где в журналах / системе GCP я мог бы узнать, какой именно процесс зависает. Это кажется совершенно непрозрачной ошибкой без указания того, что именно происходит не так. Это какая-то ошибка в приложении (которое работает нормально локально)? Если это так, я ожидаю, что он все еще будет развертываться, но просто будет показывать ошибку при доступе к веб-сайту.

Любая помощь очень ценится.

Ошибка:

OperationError: Error Response: [4] Your deployment has failed to become healthy in the allotted time and therefore was rolled back. If you believe this was an error, try adjusting the 'app_start_timeout_sec' setting in the 'readiness_check' section.
ERROR: (gcloud.app.deploy) Error Response: [4] Your deployment has failed to become healthy in the allotted time and therefore was rolled back. If you believe this was an error, try adjusting the 'app_start_timeout_sec' setting in the 'readiness_check' section.

Это мой Dockerfile:

FROM gcr.io/google-appengine/python

RUN apt-get update && apt-get install software-properties-common -y
RUN add-apt-repository ppa:ubuntugis/ppa

RUN apt-get install -y gdal-bin


# Create a virtualenv for dependencies. This isolates these packages from
# system-level packages.
# Use -p python3 or -p python3.7 to select python version. Default is version 2.
RUN virtualenv /env -p python3.7



# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Copy the application's requirements.txt and run pip to install all
# dependencies into the virtualenv
COPY requirements.txt /tmp
WORKDIR /tmp
RUN pip install -r requirements.txt

# Add the application source code.
ADD . /

EXPOSE 8080
# Run a WSGI server to serve the application. gunicorn must be declared as
# a dependency in requirements.txt.
#CMD gunicorn -b :$PORT main:app

А это мой app.yaml:

runtime: custom
env: flex

runtime_config:
  # You can also specify 2 for Python 2.7
  python_version: 3.7

person Jamie    schedule 19.06.2020    source источник
comment
Вы пытались увеличить значение app_start_timeout_sec? (максимум 1800). Это даст более широкое временное окно для запуска и готовности вашего приложения. См. документации для получения более подробной информации.   -  person sllopis    schedule 19.06.2020
comment
Да, к сожалению, это все еще не работает. Однако, спасибо.   -  person Jamie    schedule 19.06.2020
comment
Это нормально, что вы прокомментировали entrypoint и CMD?   -  person Ferregina Masalo    schedule 21.06.2020
comment
Хорошее место, но, к сожалению, не имеет значения :(   -  person Jamie    schedule 21.06.2020
comment
Попробуйте указать проверки работоспособности в app.yaml и убедитесь, что вызовы конечных точек проверки работоспособности дают правильный ответ (обычно 200): cloud.google.com/appengine/docs/flexible/python/reference/   -  person Jofre    schedule 22.06.2020
comment
Я подозреваю, что в журналах есть более информативная информация, которой вы не поделились с нами. Журналы развертывания очень подробные, поэтому важные сообщения легко пропустить.   -  person gaefan    schedule 22.06.2020


Ответы (1)


Я почти уверен, что это вызвано таймаутом Gunicorn.

Чтобы отключить тайм-аут для gunicorn, измените последнюю команду в вашем Dockerfile на:

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app --timeout 0

Где: -- workers 1 --threads 8 означает один рабочий процесс и 8 потоков. (Если вы не укажете ресурсы вручную, по умолчанию будет 1 ядро ​​ЦП). Если вы решите использовать больше ядер, измените соответственно рабочие и потоки, но это немного выходит за рамки этого вопроса.

Важная часть - это --timeout 0, где он в основном предотвращает истечение времени ожидания пушкикорна.

Если вы все еще видите ошибку, то есть одно небольшое дополнение, которое, скорее всего, исправит ее. Также используйте флаг --preload при запуске пушкикорна. Итак, последней командой в Dockerfile будет:

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app --timeout 0 --preload

Это в основном гарантирует, что весь необходимый импорт и предварительная обработка будут выполнены при создании экземпляра, на котором размещен ваш контейнер Docker. Это действительно полезно, когда вы работаете с приложениями, которым требуется много времени для однократной предварительной обработки. Таким образом, как только приходит запрос, все уже загружено и готово для обслуживания этого запроса.

Чтобы максимизировать преимущества --preload, вам также необходимо переместить все импорты и т. д. в самое начало вашего основного приложения и избегать вызова импортов внутри обработчиков маршрутов.

Кроме того, нет смысла иметь команду entrypoint и в app.yaml, и в Dockerfile. На мой взгляд, лучше хранить его в Dockerfile.

Кроме того:

Я бы переместил EXPOSE 8080 сразу после строки FROM, так как это обеспечит правильное подключение вашего контейнера к внешнему миру.

person Waelmas    schedule 23.06.2020