Можно ли использовать System.Drawing.Common в функциях Azure с настраиваемым образом докера? - PullRequest
0 голосов
/ 22 марта 2019

Я использую библиотеку Aspose PDF, основанную на System.Drawing.Common, и запускаю ее на .Net Core 2.1. в линуксе Я знаю, что это не будет работать в песочнице , поэтому я пытаюсь использовать пользовательский образ Docker (установка libgdiplus, libc6-dev и ttf-mscorefonts-installer, как указано, например, Aspose ).

Он работает в докернизированном веб-API в качестве веб-приложения, но при использовании в качестве функции Azure вызовы завершаются с ошибкой PlatformNotSupportedException:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: исключение при выполнении функции: xxx ---> System.PlatformNotSupportedException: System.Drawing не поддерживается на этой платформе.

Смежные вопросы # 1 и # 2 похожи, но не используют пользовательское изображение Docker.

Суть этого вопроса: применяются ли ограничения песочницы к System.Drawing.Common также при использовании настраиваемого образа Docker?

Для справки, вот раздел образа времени выполнения из 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"]

Обновление: Работает тот же код манипуляции PDF в веб-приложении .Net Core в образе установщика Azure Functions. Это указывает на то, что проблема заключается в среде выполнения функций Azure.

Вот пример фрагмента, который нужно добавить к ранее упомянутому Dockerfile, чтобы вместо него запустить веб-приложение:

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

1 Ответ

0 голосов
/ 26 марта 2019

Похоже, что среда выполнения функций Azure накладывает некоторые ограничения независимо от базовой платформы. Правильно предположить, что ограничения такие же, как и для 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");
}
...