В настоящее время я работаю над проектом проверки концепции, используя функции Azure, NET и Docker для создания функции HttpTrigger Azure, которая использует сборку MagicSquareComp.dll, созданную в следующем учебном пособии:
https://www.mathworks.com/help/compiler_sdk/gs/create-a-dotnet-application-with-matlab-code.html
Мне удалось создать обобщенную c. NET Azure функцию, следуя инструкции ниже:
https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-function-linux-custom-image?tabs=nodejs
Я попытался объединить технологии, использованные в обоих этих уроках, чтобы создать функцию Azure, которая будет печатать магический квадрат c. Мне удалось получить эту функцию для функции HttpTrigger Azure, которая будет работать как в моей локальной среде Windows, так и на виртуальной машине Ubuntu 18.04 после установки среды выполнения MATLAB и правильной настройки. Однако, когда я пытаюсь использовать файл docker и запускать функцию Azure из контейнера docker с помощью команд docker build и docker run, я сталкиваюсь со следующей ошибкой:
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function:
MyHttpTrigger ---> System.TypeInitializationException: The type initializer for 'MagicSquareComp.Class1'
threw an exception. ---> System.TypeInitializationException: The type initializer for
'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception. ---> System.TypeInitializationException: The
type initializer for 'MathWorks.MATLAB.NET.Arrays.MWArray' threw an exception. --->
System.DllNotFoundException: Unable to load shared library 'mclmcrrt9_7.dll' or one of its dependencies.
In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable:
libmclmcrrt9_7.dll: cannot open shared object file: No such file or directory
Контейнер docker, который я использую, является контейнером Linux, и я установил на него среду выполнения MATLAB точно так же, как я установил ее на свою виртуальную машину Ubuntu 18.04, и точно так же установил переменные среды. Я убедился, что MWArray.dll и MagicSquareComp.dll находятся в каталоге / home / site / wwwroot/bin/. Я попытался скопировать папку времени выполнения MATLAB в / home / site / wwwroot/bin/runtimes/. Ни один из них, похоже, не оказал никакого влияния. Я по-прежнему получаю ту же ошибку при попытке запустить из файла 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
FROM ubuntu:18.04 AS installer-env
RUN apt-get -qq update && \
apt-get -qq install -y nodejs && \
apt-get -qq install -y npm && \
npm install -g azure-functions-core-tools && \
apt-get -qq install -y curl && \
apt-get -qq install -y wget && \
apt-get -qq install -y unzip && \
curl -sL https://aka.ms/InstallAzureCLIDeb | bash && \
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && \
dpkg -i packages-microsoft-prod.deb && \
apt-get -qq update && \
apt-get -qq install -y apt-transport-https && \
apt-get -qq update && \
apt-get -qq install -y dotnet-sdk-2.1 && \
mkdir /mcr-install && \
mkdir /opt/matlab_runtime && \
cd /mcr-install && \
wget https://ssd.mathworks.com/supportfiles/downloads/R2019b/Release/3/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2019b_Update_3_glnxa64.zip && \
unzip -q MATLAB_Runtime_R2019b_Update_3_glnxa64.zip && \
./install -destinationFolder /opt/matlab_runtime -agreeToLicense yes -mode silent && \
cd && \
rm -rf /mcr-install
COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
mkdir -p /home/site/wwwroot && \
dotnet publish *.csproj --output /home/site/wwwroot && \
chmod 777 /home/site/wwwroot/bin/MWArray.dll && \
chmod 777 /home/site/wwwroot/bin/MagicSquareComp.dll && \
cp -rf /opt/matlab_runtime /home/site/wwwroot/bin/runtimes
# 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
ENV LD_LIBRARY_PATH=/opt/matlab_runtime/v97/runtime/glnxa64:/opt/matlab_runtime/v97/bin/glnxa64:/opt/matlab_runtime/v97/sys/os/glnxa64:/opt/matlab_runtime/v97/extern/bin/glnxa64
ENV XAPPLRESDIR=/opt/matlab_runtime/v97/X11/app-defaults
COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
MagicSquareComp.dll был сгенерирован с использованием MATLAB на Windows. Не похоже, что это вызовет проблему, так как я смог запустить функцию Azure и правильно ссылаться на MagicSquareComp.dll и MWArray.dll в Linux VM.
Любая помощь в этом будет принята с благодарностью!