Как установить MATLAB MCR и среду выполнения dotnet в контейнере Docker?

Я пытаюсь создать контейнер Docker, в котором я могу использовать dotnet для запуска программы C#, которая загружает среду выполнения MATLAB (MCR) для обработки некоторых данных. (.net core 3.1, MATLAB 2014b)

Я создал образ на основе официального образа dotnet для Ubuntu, который устанавливает среду выполнения MATLAB MCR в соответствии с пример, который я нашел в Интернете. Вот мой Dockerfile:

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-focal 
ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get -qq install -y \
    unzip \
    xorg \
    wget \
    curl && \   
    mkdir /mcr-install && \
    mkdir /opt/mcr && \
    cd /mcr-install && \
    wget http://ssd.mathworks.com/supportfiles/downloads/R2014b/deployment_files/R2014b/installers/glnxa64/MCR_R2014b_glnxa64_installer.zip && \
    unzip -q MCR_R2014b_glnxa64_installer.zip && \
    ./install -destinationFolder /opt/mcr -agreeToLicense yes -mode silent && \
    cd / && \
    rm -rf mcr-install

ENV LD_LIBRARY_PATH /opt/mcr/v84/runtime/glnxa64:/opt/mcr/v84/bin/glnxa64:/opt/mcr/v84/sys/os/glnxa64:/opt/mcr/v84/extern/bin/glnxa64

Когда я запускаю контейнер в интерактивном режиме и пытаюсь запустить в нем dotnet, я получаю эту ошибку:

❯ docker run -it dotnet-mcr:0.2 /bin/bash
root@1e15419d3fee:/# dotnet --info
Failed to load ���, error: /opt/mcr/v84/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by /usr/share/dotnet/host/fxr/3.1.10/libhostfxr.so)
The library libhostfxr.so was found, but loading it from /usr/share/dotnet/host/fxr/3.1.10/libhostfxr.so failed
  - Installing .NET Core prerequisites might help resolve this problem.
     https://go.microsoft.com/fwlink/?linkid=2063370

Кажется, что последняя строка в моем Dockerfile — та, которая устанавливает LD_LIBRARY_PATH — важна для среды выполнения MCR, но нарушает работу исполняемого файла dotnet.

Как мне обойти эту проблему?

Примечание. Как прокомментировал @jdweng ниже, обновление до более поздней версии MATLAB, вероятно, может решить проблему путем выравнивания версий конфликтующих библиотек DLL. Я был бы признателен, если это возможно, за решение, не связанное с обновлением.


person urig    schedule 14.12.2020    source источник
comment
Версия Matlab, в которую вы компилируете dll, должна быть той же версии, что и установленная версия Matlab во время выполнения. Установка докера должна быть установлена ​​и иметь другую версию среды выполнения.   -  person jdweng    schedule 14.12.2020


Ответы (1)


Как написал @jdweng в комментарии к моему вопросу: решение состоит в том, чтобы использовать версии .Net и MATLAB, которые зависят от одной и той же версии общих объектов C++.

В моем случае это означает .Net Core 3.1 и MATLAB 2020b (v99). Ниже приведен файл Dockerfile, который у меня работает (опять же, на основе файла Майкла Перри пример).

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-focal 
ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get -qq update && apt-get -qq install -y \
    unzip \
    xorg \
    wget \
    curl && \   
    mkdir /mcr-install && \
    mkdir /opt/mcr && \
    cd /mcr-install && \
    wget https://ssd.mathworks.com/supportfiles/downloads/R2020b/Release/3/deployment_files/installer/complete/glnxa64/MATLAB_Runtime_R2020b_Update_3_glnxa64.zip && \
    unzip -q MATLAB_Runtime_R2020b_Update_3_glnxa64.zip && \
    ./install -destinationFolder /opt/mcr -agreeToLicense yes -mode silent && \
    cd / && \
    rm -rf mcr-install

ENV LD_LIBRARY_PATH /opt/mcr/v99/runtime/glnxa64:/opt/mcr/v99/bin/glnxa64:/opt/mcr/v99/sys/os/glnxa64:/opt/mcr/v99/extern/bin/glnxa64
person urig    schedule 13.01.2021