Google Cloud Run: Контейнер не запускается и не слушает указанный порт, несмотря на локальный успех

Вопрос или проблема

Проблема

Я развертываю приложение FastAPI с Uvicorn на Google Cloud Run. Приложение работает нормально локально, но при развертывании на Cloud Run происходит сбой с ошибкой:

Ревизия 'chat-api-00001-mcn' еще не готова и не может обслуживать трафик. Контейнер, предоставленный пользователем, не смог запуститься и слушать на порту, определенном переменной окружения PORT=8080 в течение отведенного времени.

Детали

1. Окружение:

  • Контейнер: Python 3.10 на Debian Bookworm.
  • Приложение: Приложение FastAPI, работающее через Uvicorn, использующее Google Cloud Storage и ключ API OpenAI.
  • Учётные данные: Google Cloud Storage требует учетных данных сервисного аккаунта через файл ключа JSON, который я настроил как секрет Google.
  • Dockerfile: Я настроил Dockerfile для экспонирования порта 8080, как ожидает Cloud Run, и использую $PORT в команде CMD:

2. dockerfile

# Используйте более новую версию Debian, которая включает SQLite > 3.35
FROM python:3.10-bookworm

# Установка зависимостей
RUN apt-get update && apt-get install -y wget build-essential libsqlite3-dev
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz && \
    tar xzf sqlite-autoconf-3410200.tar.gz && \
    cd sqlite-autoconf-3410200 && \
    ./configure && make && make install && \
    cd .. && rm -rf sqlite-autoconf-3410200*

# Настройка файлов приложения и зависимостей
COPY requirements.txt /chatbot/requirements.txt
COPY app /chatbot/app
WORKDIR /chatbot
RUN pip install --upgrade pip && pip install -r requirements.txt

# Экспонирование порта для Cloud Run
EXPOSE 8080
CMD ["sh", "-c", "uvicorn app.chat_api:app --host 0.0.0.0 --port $PORT"]

3. Настройка переменных окружения:

  • OPENAI_API_KEY и GOOGLE_APPLICATION_CREDENTIALS установлены в команде развертывания.
  • GOOGLE_APPLICATION_CREDENTIALS указывает на секрет, смонтированный Cloud Run.

4. Локальные тесты:

  • Цель: Убедиться, что контейнеризированное приложение FastAPI работает корректно перед развертыванием.
  • Результат: Контейнер работает как ожидается, когда его запускают локально с docker run -p 8080:8080. Запросы к API возвращают ожидаемые ответы без каких-либо ошибок.
docker run -p 8080:8080 \
  -e PORT=8080 \
  -e OPENAI_API_KEY="my_openai_api_key" \
  -e GOOGLE_APPLICATION_CREDENTIALS='/app/credentials.json' \
  -v '/path/to/local/credentials.json:/app/credentials.json' \
  europe-west1-docker.pkg.dev/chatbot/chatbot-api-repo/chatbot-api:0.3

5. Попытки развертывания:

  • Попытка №1: Установил PORT=8080 и подтвердил, что он соответствует открываемому порту. Использовал --update-secrets для загрузки учетных данных Google из секрета.
  • Попытка №2: Изменил путь в приложении на /secrets/chatbot-key, что является правильным путем для секретов Cloud Run.
  • Попытка №3: Явно обновил Dockerfile для использования порта 8080, но ошибка сохраняется.

6. Журналы:

Журналы Cloud Run указывают на ошибку FileNotFoundError, связанную с файлом учетных данных Google, хотя он существует и указан в –update-secrets.

Вопрос

Почему контейнер не запускается на Cloud Run с ошибкой порта или учетных данных, хотя локально он работает идеально? Может быть, есть проблема с тем, как Cloud Run обрабатывает открытую порцию или монтирование секретов, которую я мог упустить?

Любые идеи по решению этой проблемы с развертыванием Cloud Run будут признательны!

Ответ или решение

Почему контейнер не запускается на Google Cloud Run и как это исправить

Введение

Вы столкнулись с проблемой развертывания вашего FastAPI приложения с использованием Uvicorn на платформе Google Cloud Run. Несмотря на успешное локальное тестирование контейнера, при развертывании возникает ошибка, связанная с портом и доступом к учетным данным. Давайте подробно разберемся в причинах данной проблемы и возможных решениях.

1. Проблема с портом

Целевой порт:
Google Cloud Run ожидает, что ваше приложение будет слушать на порту, указанном в переменной окружения PORT, который по умолчанию равен 8080. При развертывании контейнера важно удостовериться, что ваш FastAPI принимает соединения именно на этом порту.

Решение:

В вашей команде запуска Uvicorn уже указаны опции для хоста и порта:

CMD ["sh", "-c", "uvicorn app.chat_api:app --host 0.0.0.0 --port $PORT"]

Эта строка должна работать корректно, но стоит проверить, действительно ли значение PORT передается в окружение. Возможно, в Cloud Run вы не указали переменную PORT при развертывании или указали неправильное значение. Убедитесь, что вы передали -e PORT=8080 в вашем деплое, если это требуется.

2. Проблемы с учетными данными

Ошибка:
Логи Cloud Run указывают на FileNotFoundError, связанный с файлом учетных данных Google. Несмотря на то, что вы настроили секреты, возникает вопрос о доступности этого файла для вашего приложения.

Решение:

  1. Путь к секрету: Убедитесь, что путь к секрету в вашей программе правильно настроен. Вы изменили путь на /secrets/chatbot-key, но проверьте, что эта директория правильно монтируется в контейнер. Убедитесь, что ваш код обращения к файлу используется именно в том месте, где секреты доступны.

  2. Проверка монтирования: Для проверки монтирования секрета, вы можете добавить временную логику в ваше приложение для отображения доступных файлов в /secrets во время инициализации.

3. Настройка и отладка

Для дополнительного понимания и отладки:

  • Логи: Причины ошибок часто можно найти в логах Cloud Run. Используйте gcloud logging read для получения более детальной информации об ошибках, которые возникают при запуске вашего контейнера.

  • Тестирование локально: Убедитесь, что ваши секреты работают локально. Сделайте это, запуская контейнер с теми же переменными окружения, которые вы планируете использовать в Cloud Run.

  • Убедитесь в доступности услуг: Приложение может зависеть от внешних API, таких как OpenAI. Позаботьтесь о том, чтобы приложение не зависело от сетевых ресурсов, доступ к которым ограничен.

  • Проверка сетевой доступности: Иногда Cloud Run может блокировать доступ к Внешним API из-за настроек безопасности. Проверьте настройки фаервола и IAM ролей.

Заключение

Существует множество факторов, которые могут вызвать проблемы с запуском контейнера в Cloud Run. Ваша проблема может быть связана как с неправильной конфигурацией портов, так и с настройкой доступа к учетным данным. Следуя указанным шагам, вы сможете диагностировать и устранить неисправности. Важно помнить, что облачная инфраструктура требует особого внимания к деталям конфигурации. Удачи в развертывании вашего FastAPI приложения!

Оцените материал
Добавить комментарий

Капча загружается...