Запуск изолированной рабочей Azure Function в контейнере Docker

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

Я пытаюсь запустить функцию Azure с изолированной моделью рабочего процесса в контейнере, но она выдает следующую ошибку:

Необработанное исключение. System.InvalidOperationException: URI канала gRPC ‘http://:’ не может быть разобран.

Вот мой Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

WORKDIR /src

COPY ["Email.Function/Email.Function.csproj", "Email.Function/"]
RUN dotnet restore "Email.Function/Email.Function.csproj"

COPY . .

RUN dotnet build "Email.Function/Email.Function.csproj" -c Release -o /app/build

RUN dotnet publish "Email.Function/Email.Function.csproj" -c Release -o /app/publish

FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0

WORKDIR /home/site/wwwroot

COPY --from=build /app/publish .

CMD ["dotnet", "Email.Function.dll", "--dotnet-isolated"]

Я видел, что некоторые обходные пути заключались в добавлении следующих переменных окружения, но это тоже не сработало

ENV FUNCTIONS_WORKER_GRPC_URI=http://127.0.0.1:5000
ENV WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED=0

Я могу запускать и отлаживать функцию без использования Docker, но она не работает внутри контейнера.

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

Запуск Azure Functions с изолированным рабочим процессом в Docker-контейнере

Проблема: Вы сталкиваетесь с ошибкой при запуске Azure Function с изолированным рабочим процессом в Docker-контейнере. Ошибка выглядит следующим образом:

Unhandled exception. System.InvalidOperationException: The gRPC channel URI 'http://:' could not be parsed.

Эта ошибка указывает на проблему с налаживанием канала gRPC, что является критичным для выполнения функции в изолированной среде.

Решение

  1. Проверка Dockerfile:
    Ваш текущий Dockerfile выглядит корректно, но есть несколько моментов, которые можно улучшить или изменить. Вот ваш текущий Dockerfile с небольшими изменениями:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build

WORKDIR /src

COPY ["Email.Function/Email.Function.csproj", "Email.Function/"]
RUN dotnet restore "Email.Function/Email.Function.csproj"

COPY . .

RUN dotnet build "Email.Function/Email.Function.csproj" -c Release -o /app/build
RUN dotnet publish "Email.Function/Email.Function.csproj" -c Release -o /app/publish

FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0

WORKDIR /home/site/wwwroot

COPY --from=build /app/publish .

# Убедитесь, что команда CMD корректна
CMD ["dotnet", "Email.Function.dll", "--dotnet-isolated"]
  1. Установка переменных окружения:
    Выравнивание переменных окружения является важным аспектом для успешного подключения gRPC. Попробуйте использовать следующие переменные:
ENV FUNCTIONS_WORKER_GRPC_URI=http://127.0.0.1:5000
ENV WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED=0
  1. Проверка порта:
    Убедитесь, что порт 5000 доступен внутри контейнера. Если у вас есть другие запущенные сервисы, они могут занимать этот порт. Попробуйте изменить порт, если он заблокирован:
ENV FUNCTIONS_WORKER_GRPC_URI=http://127.0.0.1:5001
  1. Конфигурация gRPC:
    Убедитесь, что ваш проект правильно настраивается для работы с gRPC. В файле Host.json вашего проекта добавьте следующие параметры, если их там нет:
{
  "version": "2.0",
  "functions": [ "FunctionName" ],
  "grpc": {
    "port": 5000
  }
}
  1. Тестирование локально:
    Проверьте, можете ли вы запустить функцию локально, используя следующие команды:
func start --workers

Это позволит вам закончить отладку перед тем, как разворачивать в контейнерах.

  1. Логи и диагностика:
    Если после всех изменений проблема остается, проверьте stdout и stderr вашего контейнера на наличие дополнительных сообщений об ошибках. Можете использовать команду docker logs <container_id> для просмотра логов.

  2. Операционная система Docker:
    Убедитесь, что ваша ОС поддерживает Docker и его версии актуальны. Используйте последнюю стабильную версию Docker.

  3. Поддержка и документация:
    Всегда полезно обратиться к официальной документации Azure Functions для получения актуальной информации о настройке и работе с Azure Functions в контейнерах.

Заключение

Обратите внимание на рекомендации, описанные выше. Запуск Azure Functions в изолированном режиме в Docker может требовать некоторых нюансов в настройке, но с правильной конфигурацией и внимание к деталям, проблема с gRPC должна быть разрешена. Если вы продолжаете сталкиваться с ошибками, учитывайте возможность обращения за помощью в сообщество или техническую поддержку Microsoft.

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

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