Я пытаюсь создать док-контейнер, совместимый с 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 Я пропустил mcr.microsoft.com/windows:1809 и mcr.microsoft.com/windows/servercore:1809 . Йо да, окна: 1809 работали.
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/…
просто добавив, что я пробовал сначала mcr.microsoft.com/windows/servercore:1809, а не mcr.microsoft.com/windows:1809, я пропустил ваш ответ. вы были правы, это работает хорошо.
Как заявил @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 их нужно много. Следовательно, решение было слишком либо:
system32
хоста и контейнера Docker)
@LeoLiu-MSFT Обновлено ниже. Нет, использование 2016 дало те же результаты.