我用 Java 编写了一个示例 Azure 函数,它由 eventhub 消息触发。该函数在 FunctionApp 中部署时工作正常,但当我将其容器化并使用 KEDA 部署时,我始终看到下面的错误消息,并且函数不处理任何消息。
Worker process started and initialized.
info: Host.General[337]
Host lock lease acquired by instance ID '00000000000000000000000001DD233B'.
info: Host.Startup[413]
Host started (7675ms)
info: Host.Startup[0]
Job host started
info: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
DrainMode mode enabled
info: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
Calling StopAsync on the registered listeners
info: Host.Startup[0]
Stopping the listener 'Microsoft.Azure.WebJobs.EventHubs.Listeners.EventHubListener' for function 'MyFirstAKSFunction'
info: Host.Startup[0]
Stopped the listener 'Microsoft.Azure.WebJobs.EventHubs.Listeners.EventHubListener' for function 'MyFirstAKSFunction'
info: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
Call to StopAsync complete, registered listeners are now stopped
Docker 文件:
FROM mcr.microsoft.com/azure-functions/java:4-java17
COPY ./build ./package
RUN mkdir -p /home/site/wwwroot && \
cd /package/azure-functions/ && \
cd $(ls -d */|head -n 1) && \
cp -a . /home/site/wwwroot
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
功能启动后立即开始关闭。
我更新了 dockerfile 并解决了问题。新的 dockerfile 如下
FROM mcr.microsoft.com/azure-functions/java:4-java17
COPY ./build ./package
RUN mkdir -p /home/site/wwwroot && \
cd /package/azure-functions/ && \
cd $(ls -d */|head -n 1) && \
cp -a . /home/site/wwwroot && \
groupadd appuser -g 2000 && \
useradd -r -M -s /sbin/nologin -g appuser -c appuser appuser -u 1000 && \
mkdir -p /home/appuser/.local && \
chown -R appuser:appuser /azure-functions-host && \
chown -R appuser:appuser /home/appuser/.local
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
ASPNETCORE_URLS=http://+:8080 \
FUNCTIONS_WORKER_RUNTIME=java \
JAVA_OPTS="--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED"
# Switch to the user
USER appuser
# Expose the port
EXPOSE 8080