在 linux 容器上触发的 Azure 函数 HTTP - 函数不工作 404
Azure function HTTP triggered on linux container - function not working 404
我被卡住了,也许你能帮帮我。 (更新:经过调查,我确实知道它不起作用,因为build/release之后Azure功能的wwwroot文件夹是空的。主要问题是为什么)
我正在尝试使用 Azure 容器注册表发布 Azure 函数 (Linux) 这一步我认为我成功了。我确实创建了 CI/CD 管道并且所有内容都已正确发布。
当我像这样进入我的 azure 函数主页时:https://myAzureFuncion.azurewebsites.net/(这只是示例)
我确实看到了:
开头是函数本身。这没什么特别的,因为我只是想测试 CI/CD 所以它是 AF 模板。我只是将授权更改为匿名(以排除身份验证问题):
[FunctionName("MyAzureFunctionName")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request. Runned!");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
所以我很高兴 - 对吧?不,因为它不工作。我正在尝试通过 HTTP 请求触发此功能:
https://myAzureFuncion.azurewebsites.net/api/MyAzureFunctionName?name=Mark
而且我一直收到 404 Not Found。我确实用邮递员检查过它:相同(以前我尝试使用功能授权?代码=(code_in_host)和headers x-functions-key。所有时间都是相同的信息--> 404 未找到)
因为没有这个功能。
当然,当我在本地 运行 时(对 windows 使用 docker)一切正常。我是运行宁:
https://localhost:some_port/api/MyAzureFunctionName?name=Mark
我收到了正确的答复。
你能告诉我要检查什么以及如何诊断这里的问题吗?我已输入 App Insights Live Metrics --> 但未记录任何请求。
如何诊断这里的问题?
[更新 04.05.2020 01:35]
这是 YAML 中此组件的发布管道的样子
steps:
- task: AzureFunctionAppContainer@1
displayName: 'Azure Function App on Container Deploy: MyFunctionName'
inputs:
azureSubscription: MySubscription
appName: MyFunctionName
imageName: 'myAcrContainer.azurecr.io/mobile/MyFunctionName:$(Build.BuildNumber)'
对于这个 Azure 功能,我还在 Azure 门户中看到了一件奇怪的事情。当我进入功能菜单时 - 有信息,有 none:
当我使用 "new Azure Function management experience"
时出现同样的情况
[更新 04.05.2020 11:40]
正在提供有关此案的更多信息。这是 docker 图片的样子:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/azure-functions/dotnet:3.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]
COPY ["MyFunctionName/MyFunctionName.csproj", "MyFunctionName/"]
RUN dotnet restore "MyFunctionName/MyFunctionName.csproj"
COPY . .
WORKDIR "/src/MyFunctionName"
RUN dotnet build "MyFunctionName.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyFunctionName.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/app
这是我正在使用的构建管道:
- stage: BuildMyAzureFunction
displayName: Build and push MyAzureFunction stage
jobs:
- job: Build
displayName: Build
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push image to container registry
inputs:
containerRegistry: $(dockerRegistryServiceConnection)
repository: $(imageRepositoryMyAzureFunction)
command: 'buildAndPush'
Dockerfile: $(dockerfilePathAzureMyAzureFunction)
tags: |
$(tag)
我不知道我还能给你什么:)
也许 Azure 门户中的容器设置:
以及最新 docker 版本的日志:
2020-05-04 09:32:32.693 INFO - Recycling container because of AppSettingsChange and isMainSite = True
2020-05-04 09:32:32.777 INFO - Pulling image: myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.829 INFO - 20200503.11 Pulling from mobile/myAzureFunction
2020-05-04 09:32:33.832 INFO - Digest: sha256:688090984dbc5d257b7d4eefff886affa451c59407edd46792dfc81726f393ec
2020-05-04 09:32:33.832 INFO - Status: Image is up to date for myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.835 INFO - Pull Image successful, Time taken: 0 Minutes and 1 Seconds
2020-05-04 09:32:33.959 INFO - Starting container for site
2020-05-04 09:32:33.961 INFO - docker run -d -p 7287:80 --name myAzureFunction_1_84dd4d10 -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:39.421 INFO - Starting container for site
2020-05-04 09:32:39.422 INFO - docker run -d -p 1500:8081 --name myAzureFunction_1_84dd4d10_middleware -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction-e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 appsvc/middleware:2001061754 /Host.ListenUrl=http://0.0.0.0:8081 /Host.DestinationHostUrl=http://172.16.2.6:80 /Host.UseFileLogging=true
2020-05-04 09:32:44.658 INFO - Initiating warmup request to container myAzureFunction_1_84dd4d10 for site myAzureFunction
2020-05-04 09:33:00.400 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 15.7420671 sec
2020-05-04 09:33:16.088 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 31.4308809 sec
2020-05-04 09:33:33.284 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 48.6269148 sec
2020-05-04 09:33:56.001 INFO - Container myAzureFunction_1_84dd4d10 for site myAzureFunctioninitialized successfully and is ready to serve requests.
2020-05-04 09:33:56.004 INFO - Initiating warmup request to container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction
2020-05-04 09:34:04.506 INFO - Container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction initialized successfully and is ready to serve requests.
2020_05_04_RD501AC582A899_easyauth_docker.log:
2020_05_04_RD501AC582A899_default_docker.log:
2020-05-04T09:21:14.187664147Z Hosting environment: Production
2020-05-04T09:21:14.187744046Z Content root path: /app
2020-05-04T09:21:14.187750446Z Now listening on: http://[::]:80
2020-05-04T09:21:14.187754446Z Application started. Press Ctrl+C to shut down.
2020-05-04T09:33:49.229983024Z Hosting environment: Production
2020-05-04T09:33:49.232401696Z Content root path: /app
2020-05-04T09:33:49.232413096Z Now listening on: http://[::]:80
2020-05-04T09:33:49.232417396Z Application started. Press Ctrl+C to shut down.
[更新 04.05.2020 15:55]
我检查了部署中心,看起来没问题:
但是因为我发布了 3 个 thigns(1 个 SignalR 集线器和 2 个 azure 函数 - 当然都是 "not working")我在想 - 也许它正在以某种方式混合(并且在这个 azure 函数应用程序上 - 事实上SignalR 正在发布?
我确实检查了这个发布任务日志(它应该发布 MyAzureFunction)并且一切看起来都正确(日志中到处都是我的 MyAzureFunction):
这是我的发布管道的样子:
这是持续部署触发器配置:
这是第 2 阶段(用于发布 azure 函数)预部署设置:
最后,发布步骤本身(虽然我已经发布了它的 YAML 版本。老实说 - 一切都检查过了。image/app 名称没有错配)
[更新 04.05.2020 16:15]
所以现在我 100% 知道发生了什么。在没有任何errors/warnings的情况下成功发布后,azure函数只是空的:)
我已经使用高级工具检查了 wwwroot 的内容(转到 https://myAzureFunction.scm.azurewebsites.net/wwwroot/ 之后)
结果如下:
所以它为什么不起作用是可以理解的:)主要问题是"What the hell happened"?:)
我确实尝试在部署中心同步代码(如@djsly 所建议的那样)但它不起作用(可能是因为它由容器管理)但是我在尝试同步时添加了一条消息:
[更新 05.05.2020 00:18]
我确实连接到 Azure 容器注册表并下载了映像,该映像应该是 运行在 Azure 中支持此 Azure 功能的映像。
所以我做了 运行ned:
docker login myAcrContainer.azurecr.io
docker pull myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
docker run -it --rm -p 31234:80 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
我确实击中了 http://localhost:31234/api/MyAzureFuncionFuns
一切正常。所以它证实了我的怀疑,图像在 Azure 门户上的 Azure 功能上没有正确 "runned"。
问题是:我做错了什么 - 还是 Azure 错误?
我的应用服务计划有问题。这是它的样子(在 Azure 函数创建期间):
这里是计划详情:
现在是免费试用版(正如他们在我创建它时提议的那样)这可能是原因他们不应该禁止某些东西而不是允许然后破坏东西吗?;)
对于遇到类似问题的任何人
我或多或少得到了问题的 "what is the root cause" 信息。 MS 支持人员联系我并指出这是 docker 文件的问题。
他指出了两点:我正在把AzureWebJobsScriptRoot
改成/app
。他声称这可能是它在本地机器上工作而不是在 AzureWebJobsScriptRoot
是 /home/site/wwwroot
的 Azure 门户上工作的原因
关于此声明的两个有趣事实:
1) 不是我创建了这个 docker 文件(我还不是菜鸟)这是 MS(插件)的功能,它允许您右键单击项目并选择添加->Docker支持
这是这个功能:https://docs.microsoft.com/pl-pl/visualstudio/containers/overview?view=vs-2019
2) 究竟谁会在工作环境中造成如此差异,以至于在本地 docker 上工作的某些东西不会在 Azure 门户上的 docker 上工作 - 这太疯狂了:)
并使用此命令:
func init LocalFunctionsProject --worker-runtime dotnet --docker
它会创建这样的 docker 文件(或多或少)
FROM microsoft/dotnet:2.2-sdk AS installer-env
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:2.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
这里最重要的是 - 它是针对 Azure Function 2 的,我正在使用 Azure Function 3。不过,我确实更改了图像版本以适应版本 3,并且我确实扩展了它以涵盖这一事实,我必须构建引用的库。但它仍然不工作 :)(意思是,它在本地工作但在 Azure 门户上不工作)
就docker这件事,我会创建新的SOF。但我留下这条评论 - 也许它会对某人有所帮助。
[2020 年 5 月 13 日更新]
对于寻找问题根本原因的任何人。如果您要查找 Azure 函数上的 404 问题 - 请查看此处:
我遇到了这个问题,但部分原因是 visual studio 太傻了,部分原因是我的文件夹结构以及我希望 Visual Studio 工作的方式。
这是我的文件夹结构:
/repoRoot/Engines/MyEngine/MyEngine/Dockerfile
/repoRoot/Engines/MyEngine/MyEngine/myengine.csproj
...etc
Visual Studio 执行 docker 构建命令(以及 Dockerfile 上下文),如下所示:
docker build -f "G:\repoRoot\enginesFolder\engineIWasWorkingOn\Dockerfile" --force-rm -t imgname:latest --target installer-env --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=imgname" "G:\repoRoot\enginesFolder\
最后一个参数很重要 - 我希望它从内部 MyEngine
文件夹执行,Dockerfile
所在的文件夹。
除此之外,我需要打开:
WEBSITES_ENABLE_APP_SERVICE_STORAGE: true
在我的 Azure 应用程序服务配置中,我需要将 Azure Functions 版本设置为 2,这就是我的 host.json
目标的原因。
最终,这是我最终使用的docker文件:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app/YourInnerFolderHere && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
VOLUME /home/site/wwwroot /home/site/wwwroot
请注意上面的“/YourInnerFolderHere
”——我需要进入 csproj
所在的内部文件夹。
我添加了 VOLUME 映射,但我认为它不会导致此部署成功。我在尝试确定之间更改了太多东西,但是删除它并重新部署并没有使我的函数应用程序停止工作。
我被卡住了,也许你能帮帮我。 (更新:经过调查,我确实知道它不起作用,因为build/release之后Azure功能的wwwroot文件夹是空的。主要问题是为什么)
我正在尝试使用 Azure 容器注册表发布 Azure 函数 (Linux) 这一步我认为我成功了。我确实创建了 CI/CD 管道并且所有内容都已正确发布。
当我像这样进入我的 azure 函数主页时:https://myAzureFuncion.azurewebsites.net/(这只是示例)
我确实看到了:
开头是函数本身。这没什么特别的,因为我只是想测试 CI/CD 所以它是 AF 模板。我只是将授权更改为匿名(以排除身份验证问题):
[FunctionName("MyAzureFunctionName")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request. Runned!");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
所以我很高兴 - 对吧?不,因为它不工作。我正在尝试通过 HTTP 请求触发此功能:
https://myAzureFuncion.azurewebsites.net/api/MyAzureFunctionName?name=Mark
而且我一直收到 404 Not Found。我确实用邮递员检查过它:相同(以前我尝试使用功能授权?代码=(code_in_host)和headers x-functions-key。所有时间都是相同的信息--> 404 未找到)
因为没有这个功能。
当然,当我在本地 运行 时(对 windows 使用 docker)一切正常。我是运行宁:
https://localhost:some_port/api/MyAzureFunctionName?name=Mark
我收到了正确的答复。
你能告诉我要检查什么以及如何诊断这里的问题吗?我已输入 App Insights Live Metrics --> 但未记录任何请求。
如何诊断这里的问题?
[更新 04.05.2020 01:35]
这是 YAML 中此组件的发布管道的样子
steps:
- task: AzureFunctionAppContainer@1
displayName: 'Azure Function App on Container Deploy: MyFunctionName'
inputs:
azureSubscription: MySubscription
appName: MyFunctionName
imageName: 'myAcrContainer.azurecr.io/mobile/MyFunctionName:$(Build.BuildNumber)'
对于这个 Azure 功能,我还在 Azure 门户中看到了一件奇怪的事情。当我进入功能菜单时 - 有信息,有 none:
当我使用 "new Azure Function management experience"
时出现同样的情况[更新 04.05.2020 11:40]
正在提供有关此案的更多信息。这是 docker 图片的样子:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/azure-functions/dotnet:3.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["BuildChat/BuildChat.csproj", "BuildChat/"]
COPY ["MyFunctionName/MyFunctionName.csproj", "MyFunctionName/"]
RUN dotnet restore "MyFunctionName/MyFunctionName.csproj"
COPY . .
WORKDIR "/src/MyFunctionName"
RUN dotnet build "MyFunctionName.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyFunctionName.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV AzureWebJobsScriptRoot=/app
这是我正在使用的构建管道:
- stage: BuildMyAzureFunction
displayName: Build and push MyAzureFunction stage
jobs:
- job: Build
displayName: Build
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push image to container registry
inputs:
containerRegistry: $(dockerRegistryServiceConnection)
repository: $(imageRepositoryMyAzureFunction)
command: 'buildAndPush'
Dockerfile: $(dockerfilePathAzureMyAzureFunction)
tags: |
$(tag)
我不知道我还能给你什么:)
也许 Azure 门户中的容器设置:
以及最新 docker 版本的日志:
2020-05-04 09:32:32.693 INFO - Recycling container because of AppSettingsChange and isMainSite = True
2020-05-04 09:32:32.777 INFO - Pulling image: myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.829 INFO - 20200503.11 Pulling from mobile/myAzureFunction
2020-05-04 09:32:33.832 INFO - Digest: sha256:688090984dbc5d257b7d4eefff886affa451c59407edd46792dfc81726f393ec
2020-05-04 09:32:33.832 INFO - Status: Image is up to date for myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:33.835 INFO - Pull Image successful, Time taken: 0 Minutes and 1 Seconds
2020-05-04 09:32:33.959 INFO - Starting container for site
2020-05-04 09:32:33.961 INFO - docker run -d -p 7287:80 --name myAzureFunction_1_84dd4d10 -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
2020-05-04 09:32:39.421 INFO - Starting container for site
2020-05-04 09:32:39.422 INFO - docker run -d -p 1500:8081 --name myAzureFunction_1_84dd4d10_middleware -e WEBSITE_CORS_ALLOWED_ORIGINS=https://functions.azure.com,https://functions-staging.azure.com,https://functions-next.azure.com -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=myAzureFunction-e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=myAzureFunction.azurewebsites.net -e WEBSITE_INSTANCE_ID=8da8a02a13a3cdde53ad6aafcd4eb717ca00dd6bc65ff07378d74a0cd859e1c0 -e HTTP_LOGGING_ENABLED=1 appsvc/middleware:2001061754 /Host.ListenUrl=http://0.0.0.0:8081 /Host.DestinationHostUrl=http://172.16.2.6:80 /Host.UseFileLogging=true
2020-05-04 09:32:44.658 INFO - Initiating warmup request to container myAzureFunction_1_84dd4d10 for site myAzureFunction
2020-05-04 09:33:00.400 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 15.7420671 sec
2020-05-04 09:33:16.088 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 31.4308809 sec
2020-05-04 09:33:33.284 INFO - Waiting for response to warmup request for container myAzureFunction_1_84dd4d10. Elapsed time = 48.6269148 sec
2020-05-04 09:33:56.001 INFO - Container myAzureFunction_1_84dd4d10 for site myAzureFunctioninitialized successfully and is ready to serve requests.
2020-05-04 09:33:56.004 INFO - Initiating warmup request to container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction
2020-05-04 09:34:04.506 INFO - Container myAzureFunction_1_84dd4d10_middleware for site myAzureFunction initialized successfully and is ready to serve requests.
2020_05_04_RD501AC582A899_easyauth_docker.log:
2020_05_04_RD501AC582A899_default_docker.log:
2020-05-04T09:21:14.187664147Z Hosting environment: Production
2020-05-04T09:21:14.187744046Z Content root path: /app
2020-05-04T09:21:14.187750446Z Now listening on: http://[::]:80
2020-05-04T09:21:14.187754446Z Application started. Press Ctrl+C to shut down.
2020-05-04T09:33:49.229983024Z Hosting environment: Production
2020-05-04T09:33:49.232401696Z Content root path: /app
2020-05-04T09:33:49.232413096Z Now listening on: http://[::]:80
2020-05-04T09:33:49.232417396Z Application started. Press Ctrl+C to shut down.
[更新 04.05.2020 15:55]
我检查了部署中心,看起来没问题:
但是因为我发布了 3 个 thigns(1 个 SignalR 集线器和 2 个 azure 函数 - 当然都是 "not working")我在想 - 也许它正在以某种方式混合(并且在这个 azure 函数应用程序上 - 事实上SignalR 正在发布?
我确实检查了这个发布任务日志(它应该发布 MyAzureFunction)并且一切看起来都正确(日志中到处都是我的 MyAzureFunction):
这是我的发布管道的样子:
这是持续部署触发器配置:
这是第 2 阶段(用于发布 azure 函数)预部署设置:
最后,发布步骤本身(虽然我已经发布了它的 YAML 版本。老实说 - 一切都检查过了。image/app 名称没有错配)
[更新 04.05.2020 16:15]
所以现在我 100% 知道发生了什么。在没有任何errors/warnings的情况下成功发布后,azure函数只是空的:)
我已经使用高级工具检查了 wwwroot 的内容(转到 https://myAzureFunction.scm.azurewebsites.net/wwwroot/ 之后)
结果如下:
所以它为什么不起作用是可以理解的:)主要问题是"What the hell happened"?:)
我确实尝试在部署中心同步代码(如@djsly 所建议的那样)但它不起作用(可能是因为它由容器管理)但是我在尝试同步时添加了一条消息:
[更新 05.05.2020 00:18]
我确实连接到 Azure 容器注册表并下载了映像,该映像应该是 运行在 Azure 中支持此 Azure 功能的映像。
所以我做了 运行ned:
docker login myAcrContainer.azurecr.io
docker pull myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
docker run -it --rm -p 31234:80 myAcrContainer.azurecr.io/mobile/myAzureFunction:20200503.11
我确实击中了 http://localhost:31234/api/MyAzureFuncionFuns
一切正常。所以它证实了我的怀疑,图像在 Azure 门户上的 Azure 功能上没有正确 "runned"。
问题是:我做错了什么 - 还是 Azure 错误?
我的应用服务计划有问题。这是它的样子(在 Azure 函数创建期间):
这里是计划详情:
现在是免费试用版(正如他们在我创建它时提议的那样)这可能是原因他们不应该禁止某些东西而不是允许然后破坏东西吗?;)
对于遇到类似问题的任何人
我或多或少得到了问题的 "what is the root cause" 信息。 MS 支持人员联系我并指出这是 docker 文件的问题。
他指出了两点:我正在把AzureWebJobsScriptRoot
改成/app
。他声称这可能是它在本地机器上工作而不是在 AzureWebJobsScriptRoot
是 /home/site/wwwroot
关于此声明的两个有趣事实:
1) 不是我创建了这个 docker 文件(我还不是菜鸟)这是 MS(插件)的功能,它允许您右键单击项目并选择添加->Docker支持
这是这个功能:https://docs.microsoft.com/pl-pl/visualstudio/containers/overview?view=vs-2019
2) 究竟谁会在工作环境中造成如此差异,以至于在本地 docker 上工作的某些东西不会在 Azure 门户上的 docker 上工作 - 这太疯狂了:)
并使用此命令:
func init LocalFunctionsProject --worker-runtime dotnet --docker
它会创建这样的 docker 文件(或多或少)
FROM microsoft/dotnet:2.2-sdk AS installer-env
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
# To enable ssh & remote debugging on app service change the base image to the one below
# FROM mcr.microsoft.com/azure-functions/dotnet:2.0-appservice
FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
这里最重要的是 - 它是针对 Azure Function 2 的,我正在使用 Azure Function 3。不过,我确实更改了图像版本以适应版本 3,并且我确实扩展了它以涵盖这一事实,我必须构建引用的库。但它仍然不工作 :)(意思是,它在本地工作但在 Azure 门户上不工作)
就docker这件事,我会创建新的SOF。但我留下这条评论 - 也许它会对某人有所帮助。
[2020 年 5 月 13 日更新]
对于寻找问题根本原因的任何人。如果您要查找 Azure 函数上的 404 问题 - 请查看此处:
我遇到了这个问题,但部分原因是 visual studio 太傻了,部分原因是我的文件夹结构以及我希望 Visual Studio 工作的方式。
这是我的文件夹结构:
/repoRoot/Engines/MyEngine/MyEngine/Dockerfile
/repoRoot/Engines/MyEngine/MyEngine/myengine.csproj
...etc
Visual Studio 执行 docker 构建命令(以及 Dockerfile 上下文),如下所示:
docker build -f "G:\repoRoot\enginesFolder\engineIWasWorkingOn\Dockerfile" --force-rm -t imgname:latest --target installer-env --label "com.microsoft.created-by=visual-studio" --label "com.microsoft.visual-studio.project-name=imgname" "G:\repoRoot\enginesFolder\
最后一个参数很重要 - 我希望它从内部 MyEngine
文件夹执行,Dockerfile
所在的文件夹。
除此之外,我需要打开:
WEBSITES_ENABLE_APP_SERVICE_STORAGE: true
在我的 Azure 应用程序服务配置中,我需要将 Azure Functions 版本设置为 2,这就是我的 host.json
目标的原因。
最终,这是我最终使用的docker文件:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS installer-env
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app/YourInnerFolderHere && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot
FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
VOLUME /home/site/wwwroot /home/site/wwwroot
请注意上面的“/YourInnerFolderHere
”——我需要进入 csproj
所在的内部文件夹。
我添加了 VOLUME 映射,但我认为它不会导致此部署成功。我在尝试确定之间更改了太多东西,但是删除它并重新部署并没有使我的函数应用程序停止工作。