Нахождение недостающей Dll на Windows Server Core в Docker
Я пытаюсь собрать консольное приложение в контейнере Windows Docker, используя Windows Server Core, в соответствии с этими инструкциями от Microsoft.
Проблема у меня заключается в том, что при запуске в контейнере приложение завершается без сообщения об ошибке. Я подозреваю, что это происходит из-за отсутствия системной библиотеки DLL в Windows Server Core, но в отличие от рабочего стола Windows нет всплывающего окна приложения для определения отсутствующей библиотеки DLL. Также нет ничего в системном журнале.
Что еще я могу сделать, чтобы решить проблему?
2 ответа
У меня сработало (более подробное объяснение см. здесь https://stefanscherer.github.io/find-dependentities-in-windows-containers/):
- Ядро сервера Windows виртуальной машины Azure
- Установите Procmon и отфильтруйте свой процесс через загрузку iwr.
- Поместите свой zip-архив в Azure BLOB и загрузите его через URL-адрес SAS и разверните tar, если архивировать.
- Начните свой процесс.
- Поиск записей о сбоях/ошибках.
- Prey, ваша недостающая DLL не является dll пользовательского интерфейса. Потому что у виртуальной машины Windows Core есть пользовательский интерфейс, а у версии Docker, похоже, нет.
Если кто-то ищет способ узнать, какая dll не была найдена/разрешена в контейнере без графического интерфейса, через несколько часов я нашел инструмент под названием «Зависимости», который был единственным, который мне действительно помог . Мусорная корзина Micorsoft разрешила только первый уровень дерева, а ldd из cygwin не смог разрешить имена некоторых DLL.
Dependencies.exe -chain my_executable.exe
Зависимости могут построить целый граф со всеми DLL, которые загружаются рекурсивно, и определить их путь к системе. Из этого графика вы можете легко определить, чего не хватает, выполнив поиск по строке NOT_FOUND.
Пример вывода:
├ exe_dat.exe (ROOT) : ..\Release\exe_dat.exe
| ├ adtfstreaming_290.dll (ApplicationDirectory) : ..\Release\adtfstreaming_290.dll
| | ├ MSVCP100.dll (WindowsFolder) : C:\Windows\system32\MSVCP100.dll
| | | ├ MSVCR100.dll (WindowsFolder) : C:\Windows\system32\MSVCR100.dll
| | | | ├ KERNEL32.dll (WellKnownDlls) : C:\Windows\system32\kernel32.dll
| | | | | ├ api-ms-win-core-rtlsupport-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll
| | | | | ├ ntdll.dll (WellKnownDlls) : C:\Windows\system32\ntdll.dll
| | | | | ├ KERNELBASE.dll (WellKnownDlls) : C:\Windows\system32\kernelbase.dll
| | | | | | ├ ntdll.dll (WellKnownDlls) : C:\Windows\system32\ntdll.dll
| | | | | | ├ api-ms-win-eventing-provider-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\kernelbase.dll
| | | | | | ├ api-ms-win-core-apiquery-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll
| | | | | | ├ api-ms-win-core-apiquery-l1-1-1.dll (ApiSetSchema) : C:\Windows\system32\ntdll.dll
| | | | | | ├ ext-ms-win-advapi32-registry-l1-1-0.dll (ApiSetSchema) : C:\Windows\system32\advapi32.dll
...