Matlab, контейнер Docker, совместимый с Windows, не может выполнить этапы задания Matlab задания Azure Devops CI/CD

Я пытаюсь создать док-контейнер, совместимый с Matlab/Windows/FMU, для запуска моих работ AzureDevops CI/CD Pipeline. Но у меня возникают проблемы, когда я запускаю онлайн-задачу сборки CI. Когда он пытается запустить любой код Matlab, я получаю его ошибку:

Ошибка:

2020-12-10T14:55:08.0295754Z ##[debug]   cd('C:\azp\agent\_work\_temp'); command_3a2582de_1b59_40fc_8400_bb6ddbb6b019
2020-12-10T14:55:08.0312327Z [command]C:\Windows\system32\cmd.exe /D /S /C "C:\azp\agent\_work\_tasks\RunMATLABCommand_28fdff80-51b4-4b6e-83e1-cfcf3f3b25a6\0.3.7\bin\run_matlab_command.bat "cd('C:\azp\agent\_work\_temp'); command_3a2582de_1b59_40fc_8400_bb6ddbb6b019""
2020-12-10T14:55:08.8200355Z Fatal Internal Error: std::exception: Bundle#4 start failed: Loading C:\Program Files\MATLAB\R2017b\bin\win64\matlab_startup_plugins\lmgrimpl\libmwlmgrimpl.dllfailed with error: The specified module could not be found.

У меня нет проблем с запуском цикла CI/CD с использованием моего собственного компьютера в качестве резидентного агента, но у меня проблемы с запуском Matlab внутри моего контейнера.

Я пытался сделать это: https://www.mathworks.com/matlabcentral/answers/384746-libmwlmgrimpl-dll-error-in-r2017b путем непосредственного добавления dll в мой проект src, отправки кода (с dll) в лазурь и принудительной загрузки dll в мой док-контейнер. Не работает. Немного больше информации, у меня нет исполняемых файлов. У меня есть процесс сборки, сгенерированный из проекта управления Matlab, и у меня также есть процесс тестирования, запускающий файлы simulink внутри класса модульного тестирования Matlab.

Есть идеи?

Докерфайл:

# Indicates that the windowsservercore image will be used as the base image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019

# Metadata indicating an image maintainer.
LABEL maintainer = "***@***.com"

# Define Work Directory
WORKDIR /azp
RUN mkdir C:\install

# Installing Packet Manager
RUN powershell -command Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
RUN powershell -command Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser; Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
# Installing Depedencies
RUN mkdir c:\tools\cygwin && cd c:\tools\cygwin && curl -Sso cygwinsetup.exe https://cygwin.com/setup-x86_64.exe && start /wait cygwinsetup -q --root C:\tools\cygwin -P dos2unix,make,perl,python27,python38,rsync,libxml2,pbzip2,mc -X --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2020/05/31/142136/
RUN setx PATH "%PATH%;C:\tools\cygwin\bin" /M
RUN powershell -command choco install -y git
RUN powershell -command choco install -y mingw 
RUN powershell -command choco install -y cmake 
RUN powershell -command choco install -y wget 
RUN powershell -command choco install -y ninja 
RUN powershell -command choco install -y python3 

# Verification Step
RUN choco -?
RUN path
RUN ls
RUN wget --help

# Fetch

#RUN wget -rH https://releases.linaro.org/components/toolchain/binaries/latest-6/arm-eabi/
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
RUN python get-pip.py
# Transfert Self-Hosted Agent Script
COPY start.ps1 .
# Transfert Matlab Install & Licences
COPY _temp_matlab_R2017b_win64 C:\\install\\_temp_matlab_R2017b_win64
COPY MathWorks C:\\Users\\ContainerAdministrator\\Downloads\\MathWorks
COPY network.lic C:\\install
COPY matlab_license.dat C:\\install
COPY installer_input.txt C:\\install
# Transfert Modelon Install & Licences
COPY FMI_Toolbox-2.8-win.exe C:\\install
COPY fmi_license.lic C:\\install
RUN ls ..\install
#Install Matlab
#RUN powershell.exe -command \
#     Start-Job -ScriptBlock {C:\install\_temp_matlab_R2017b_win64\setup.exe -inputFile C:\install\installer_input.txt} -Name matlabInstallContainer ;\
#     Wait-Job -Name "matlabInstallContainer";\
#     Stop-Job -Name "matlabInstallContainer";
RUN powershell.exe -command \
  "&C:\install\_temp_matlab_R2017b_win64\setup.exe -inputFile C:\install\installer_input.txt | Out-Null"
#Install Modelon
RUN C:\install\FMI_Toolbox-2.8-win.exe /S /D=C:\Program Files (x86)\Modelon\FMI Toolbox 2.8
#RUN matlab -r "cd 'C:\Program Files (x86)\Modelon\FMI Toolbox 2.8';setup('C:\install\fmi_license.lic', true);exit;"
RUN mkdir C:\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Modelon\Licenses\Server
RUN cp C:\install\fmi_license.lic C:\Windows\ServiceProfiles\NetworkService\AppData\Roaming\Modelon\Licenses\Server

# Sets a command or process that will run each time a container is run from the new image.
CMD powershell .\start.ps1
#CMD [ "cmd" ]

Обновлять:

Все еще не работает. Я установил контейнер Windows 2016, но получил те же ошибки.

...\libmwlmgrimpl.dllfailed with error: The specified module could not be found.

Я добавляю дамп объекта, может быть, это поможет кому-то из вас? Я вижу LIBEAY32.DLL внутри дампа, но Я не вижу SSLEAY32.DLL, это нормально? Ссылка: https://www.mathworks.com/matlabcentral/answers/375270-why-does-my-matlab-compiler-standalone-application-fail-to-start-with-a-the-operating-system-not

C:\Program Files\MATLAB\R2017b\bin\win64\matlab_startup_plugins\lmgrimpl>objdump -x libmwlmgrimpl.dll | grep "DLL Name"
        DLL Name: ddux.dll
        DLL Name: instlic_4a.dll
        DLL Name: jit_launcher.dll
        DLL Name: libmwi18n.dll
        DLL Name: libmwfl.dll
        DLL Name: libmwms.dll
        DLL Name: libmwservices.dll
        DLL Name: libmx.dll
        DLL Name: libut.dll
        DLL Name: mpath.dll
        DLL Name: mvm.dll
        DLL Name: mlutil.dll
        DLL Name: settingscore.dll
        DLL Name: webproxy.dll
        DLL Name: boost_date_time-vc140-mt-1_56.dll
        DLL Name: boost_filesystem-vc140-mt-1_56.dll
        DLL Name: boost_log-vc140-mt-1_56.dll
        DLL Name: boost_system-vc140-mt-1_56.dll
        DLL Name: boost_thread-vc140-mt-1_56.dll
        DLL Name: CppMicroServices3.dll
        DLL Name: ADVAPI32.dll
        DLL Name: COMCTL32.dll
        DLL Name: COMDLG32.dll
        DLL Name: NETAPI32.dll
        DLL Name: WS2_32.dll
        DLL Name: SHLWAPI.dll
        DLL Name: dhcpcsvc.DLL
        DLL Name: PocoFoundation64.dll
        DLL Name: PocoNet64.dll
        DLL Name: PocoNetSSL64.dll
        DLL Name: WININET.dll
        DLL Name: msi.dll
        DLL Name: CRYPT32.dll
        DLL Name: IPHLPAPI.DLL
        DLL Name: MAPI32.dll
        DLL Name: ole32.dll
        DLL Name: libsqlite3.dll
        DLL Name: tbb.dll
        DLL Name: xerces-c_3_1.dll
        DLL Name: KERNEL32.dll
        DLL Name: USER32.dll
        DLL Name: SHELL32.dll
        DLL Name: OLEAUT32.dll
        DLL Name: MSVCP140.dll
        DLL Name: VCRUNTIME140.dll
        DLL Name: api-ms-win-crt-runtime-l1-1-0.dll
        DLL Name: api-ms-win-crt-stdio-l1-1-0.dll
        DLL Name: api-ms-win-crt-time-l1-1-0.dll
        DLL Name: api-ms-win-crt-convert-l1-1-0.dll
        DLL Name: api-ms-win-crt-heap-l1-1-0.dll
        DLL Name: api-ms-win-crt-environment-l1-1-0.dll
        DLL Name: api-ms-win-crt-locale-l1-1-0.dll
        DLL Name: api-ms-win-crt-string-l1-1-0.dll
        DLL Name: api-ms-win-crt-math-l1-1-0.dll
        DLL Name: api-ms-win-crt-utility-l1-1-0.dll
        DLL Name: api-ms-win-crt-filesystem-l1-1-0.dll
        DLL Name: LIBEAY32.dll

Я также добавляю работающий анализ ходока зависимостей matlab/libmwlmgrimpl, выполненный на моем рабочем компьютере (самостоятельный агент). Я не знаю, как это сделать через командную строку внутри моего док-контейнера для сравнения. Надеюсь, что это поможет найти проблему с отсутствующим модулем.

Обновление №2:

После разговора с Mathworks, используя depency walker, dependencies.exe и vim diff, я обнаружил, что на сервере Windows 2016 в папке system 32 НАМНОГО меньше DLL, чем в «Windows 10» или «сервере Windows 2016 с рабочим столом». Эти dll кажутся обязательными для работы mathlab, поэтому мне нужно было добавить их в мой контейнер. Я скопировал правильное отличие моего основного компьютера и док-контейнера в папку в моем док-контейнере и добавил его в путь. Раньше моя предыдущая ошибка происходила через секунду за 1 секунду после запуска моего задания MATLAB. теперь я получаю другую ошибку (это ПРОГРЕСС!!) и терплю неудачу на второй секунде (это ПРОГРЕСС!!).

Кто-нибудь из вас имеет представление об этом новом?

##[debug]   cd('C:\azp\agent\_work\_temp'); command_35722346_1e7d_4546_956b_f1320bcc9adc
C:\Windows\system32\cmd.exe /D /S /C "C:\azp\agent\_work\_tasks\RunMATLABCommand_28fdff80-51b4-4b6e-83e1-cfcf3f3b25a6\0.3.7\bin\run_matlab_command.bat "cd('C:\azp\agent\_work\_temp'); command_35722346_1e7d_4546_956b_f1320bcc9adc""
Fatal Internal Error: std::exception: Bundle#4 start failed: Loading C:\Program Files\MATLAB\R2017b\bin\win64\matlab_startup_plugins\lmgrimpl\libmwlmgrimpl.dllfailed with error: %1 is not a valid Win32 application.

@LeoLiu-MSFT Обновлено ниже. Нет, использование 2016 дало те же результаты.

Weltgeist 15.12.2020 13:38

@LeoLiu-MSFT Я пропустил mcr.microsoft.com/windows:1809 и mcr.microsoft.com/windows/servercore:1809 . Йо да, окна: 1809 работали.

Weltgeist 08.01.2021 19:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
649
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Matlab, контейнер Docker, совместимый с Windows, не может выполнить этапы задания Matlab задания Azure Devops CI/CD

Насколько я знаю, MATLAB R2017b не поддерживает Windows Server 2019 до MATLAB R2019a.

Для MATLAB R2017b вы можете попробовать использовать Windows Server 2016.

Вы можете проверить документ Системные требования и поддерживаемые компиляторы

Итак, вы можете попробовать использовать изображение mcr.microsoft.com/windows:1809 или mcr.microsoft.com/windows/servercore:1607.

Пробовал 1809,1607 и ltcs2016, результат тот же. У меня была такая же ошибка. Побочные эффекты: единственное изменение заключается в том, что curl не установлен в 2016 году, и cygwin не работает в некоторых версиях. stackoverflow.com/questions/43123851/…

Weltgeist 15.12.2020 13:34

просто добавив, что я пробовал сначала mcr.microsoft.com/windows/servercore:1809, а не mcr.microsoft.com/windows:1809, я пропустил ваш ответ. вы были правы, это работает хорошо.

Weltgeist 08.01.2021 19:39

Как заявил @Leo Liu-MSFT,

Для MATLAB R2017b вы можете попробовать использовать Windows Server 2016…⠀ Итак, вы можете попробовать использовать образ mcr.microsoft.com/windows:1809 или mcr.microsoft.com/windows/servercore:1607.

Чтобы расширить этот ответ:

После обращения в MathWorks я понял, что Windows 2016 Server — это базовая версия Windows с минималистичным набором библиотек DLL System 32. Но для работы MATLAB их нужно много. Следовательно, решение было слишком либо:

  1. Используйте Windows 2016 Server с возможностями рабочего стола (mcr.microsoft.com/windows:1809) или
  2. Используйте контейнер Docker Windows 2016 Server (mcr.microsoft.com/windows/servercore:1809) и добавьте все отсутствующие библиотеки DLL System32. (Что можно найти с помощью обходчика зависимостей или создания правой копии папки system32 хоста и контейнера Docker)

Другие вопросы по теме