Вопрос или проблема
Я пытаюсь запустить функцию 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, что является критичным для выполнения функции в изолированной среде.
Решение
- Проверка 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"]
- Установка переменных окружения:
Выравнивание переменных окружения является важным аспектом для успешного подключения gRPC. Попробуйте использовать следующие переменные:
ENV FUNCTIONS_WORKER_GRPC_URI=http://127.0.0.1:5000
ENV WEBSITE_USE_PLACEHOLDER_DOTNETISOLATED=0
- Проверка порта:
Убедитесь, что порт5000
доступен внутри контейнера. Если у вас есть другие запущенные сервисы, они могут занимать этот порт. Попробуйте изменить порт, если он заблокирован:
ENV FUNCTIONS_WORKER_GRPC_URI=http://127.0.0.1:5001
- Конфигурация gRPC:
Убедитесь, что ваш проект правильно настраивается для работы с gRPC. В файлеHost.json
вашего проекта добавьте следующие параметры, если их там нет:
{
"version": "2.0",
"functions": [ "FunctionName" ],
"grpc": {
"port": 5000
}
}
- Тестирование локально:
Проверьте, можете ли вы запустить функцию локально, используя следующие команды:
func start --workers
Это позволит вам закончить отладку перед тем, как разворачивать в контейнерах.
-
Логи и диагностика:
Если после всех изменений проблема остается, проверьтеstdout
иstderr
вашего контейнера на наличие дополнительных сообщений об ошибках. Можете использовать командуdocker logs <container_id>
для просмотра логов. -
Операционная система Docker:
Убедитесь, что ваша ОС поддерживает Docker и его версии актуальны. Используйте последнюю стабильную версию Docker. -
Поддержка и документация:
Всегда полезно обратиться к официальной документации Azure Functions для получения актуальной информации о настройке и работе с Azure Functions в контейнерах.
Заключение
Обратите внимание на рекомендации, описанные выше. Запуск Azure Functions в изолированном режиме в Docker может требовать некоторых нюансов в настройке, но с правильной конфигурацией и внимание к деталям, проблема с gRPC
должна быть разрешена. Если вы продолжаете сталкиваться с ошибками, учитывайте возможность обращения за помощью в сообщество или техническую поддержку Microsoft.