【问题标题】:Azure Function in Isolated Mode: How to build a Docker container?隔离模式下的 Azure 函数:如何构建 Docker 容器?
【发布时间】:2021-08-31 12:59:45
【问题描述】:

我正在尝试在 Docker 容器中构建一个在 .net5 上运行的函数应用程序。到目前为止,我只是在尝试构建项目。

这是我目前拥有的dockerfile

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY "src/" "source/"

RUN dotnet restore "source/StorageManager/StorageManager.csproj"

COPY . .
WORKDIR "source/StorageManager"
RUN dotnet build "StorageManager.csproj" -c Release -o /app/build

这是我得到的错误:

  Determining projects to restore...
  Restored /tmp/efutopu1.pad/WorkerExtensions.csproj (in 4.21 sec).
  WorkerExtensions -> /tmp/efutopu1.pad/buildout/Microsoft.Azure.Functions.Worker.Extensions.dll
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : It was not possible to find any compatible framework version [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The framework 'Microsoft.NETCore.App', version '3.1.0' was not found. [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :   - The following frameworks were found: [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :       5.0.9 at [/usr/share/dotnet/shared/Microsoft.NETCore.App] [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :  [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : You can resolve the problem by installing the specified framework and/or SDK. [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :  [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : The specified framework can be found at: [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :   - https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=3.1.0&arch=x64&rid=debian.10-x64 [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error :  [/tmp/efutopu1.pad/WorkerExtensions.csproj]
/root/.nuget/packages/microsoft.net.sdk.functions/3.0.11/build/Microsoft.NET.Sdk.Functions.Build.targets(32,5): error : Metadata generation failed. [/tmp/efutopu1.pad/WorkerExtensions.csproj]

Build FAILED.

问题

我不明白发生了什么。似乎Microsoft.Azure.Functions.Worker.Extensions.dll 包需要更多的东西,而不仅仅是.net5 运行时,但我不确定该怎么做。我应该使用以下图片之一

https://hub.docker.com/_/microsoft-azure-functions-base

https://hub.docker.com/_/microsoft-azure-functions-dotnet-isolated

【问题讨论】:

    标签: c# docker dockerfile azure-functions .net-5


    【解决方案1】:

    更新---

    构建需要 3.1 SDK。在您的 Dockerfile 中,在第一个 FROM 语句之后添加以下行:

    COPY --from=mcr.microsoft.com/dotnet/core/sdk:3.1 /usr/share/dotnet /usr/share/dotnet
    

    稍后..

    在下面您可以关注this 或简单地this 将应用部署到容器。

    你可以使用Azure Functions Dotnet (Isolated) by Microsoft | Docker Hub

    configuring your local environment 之后,从根项目文件夹运行docker build 命令,并提供名称azurefunctionsimage 和标记v1.0.0。将 <DOCKER_ID> 替换为您的 Docker Hub 帐户 ID。此命令为容器构建 Docker 映像。

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
    

    命令完成后,您可以在本地运行新容器。

    要测试构建,请使用docker run 命令在本地容器中运行映像,再次将&lt;DOCKER_ID 替换为您的Docker ID 并添加端口参数-p 8080:80

    docker run -p 8080:80 -it <docker_id>/azurefunctionsimage:v1.0.0
    
    

    图像在本地容器中启动后,浏览到http://localhost:8080/api/HttpExample,它应该会显示与以前相同的问候消息。由于您创建的 HTTP 触发函数使用匿名授权,因此您可以调用容器中运行的函数,而无需获取访问密钥。

    在将函数代码部署到 Azure 之前,您需要创建三个资源:checkout Create supporting Azure resources for your function

    【讨论】:

    • 答案对我来说有点模糊,对于这个问题似乎不够具体。我有兴趣将正确的语句放入 docker 文件中,该文件将同时使用 azurefunctionimage 并构建/包含我的函数应用程序......我在答案中没有看到这一点:(
    • 我已经更新了一些在构建过程中需要的内容,您可以进一步关注包含大量示例的文档。
    • 我在这方面没有太大进展。一般来说,构建容器的文档确实存在。然而,关于如何创建一个 dockerfile 来构建和容器化在独立模式下运行的函数应用程序的文档非常稀少......
    • 找到解决方案后请更新。这可能对其他社区成员有益。
    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多