System.Drawing.Common可以在Azure Functions中与自定义Docker映像一起使用吗?

时间:2019-03-22 10:27:38

标签: azure docker .net-core azure-functions aspose.pdf

我正在使用一个依赖于System.Drawing.Common的Aspose PDF库,并在.Net Core 2.1上运行它。在Linux上。我知道这在sandbox中不起作用,所以我尝试使用自定义Docker映像(按照Aspose的指示安装libgdiplus,libc6-dev和ttf-mscorefonts-installer)。

我让它在作为Web应用程序的dockerized Web API中工作,但是当用作Azure函数时,调用失败,并显示PlatformNotSupportedException:

  

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时发生异常:xxx ---> System.PlatformNotSupportedException:该平台不支持System.Drawing。

相关问题#1#2类似,但是它们不使用自定义Docker映像。

这个问题的实质是:使用自定义Docker映像时,对System.Drawing.Common的沙箱限制也适用吗?

作为参考,这是Dockerfile中的运行时映像部分:

FROM mcr.microsoft.com/azure-functions/dotnet:2.0

#libgdiplus, libc6-dev and ttf-mscorefonts are for the aspose library
# sources.list manipulation and eula acceptance stuff is for ttf-mscorefonts
RUN sed -i "s/main/main contrib/g" /etc/apt/sources.list \
&& echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections \
&& apt-get update \
&& apt-get install -y --no-install-recommends libgdiplus libc6-dev ttf-mscorefonts-installer 

ENV AzureWebJobsScriptRoot=/home/site/wwwroot

COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

更新: 在Azure Functions泊坞映像中的.Net Core Web应用程序中运行相同的PDF操作代码即可。这表明问题出在Azure Functions运行时之内。

以下是添加到前面提到的Dockerfile中以使其运行Web App的示例代码片段:

WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT [ "dotnet", "/app/WebApiProjectName.dll" ]

1 个答案:

答案 0 :(得分:0)

无论基础平台如何,Azure Functions运行时似乎都存在一些限制。一个有效的猜测是,限制与Azure Web Apps相同。以下是在函数中使用System.Drawing.Common的简化测试用例,当在Windows上本地运行时,该用例也将失败:

[FunctionName("MatrixTester")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req)
{
  try
  {
    new Matrix(1, 2, 3, 4, 5, 6);
  }
  catch (PlatformNotSupportedException pnse)
  {
    return new OkObjectResult("Matrix not supported. Details: " + pnse);
  }
  return new OkObjectResult("Matrix is supported on this platform");
}