4

我目前正在尝试将我的图像优化器应用程序移植到 NanoServer docker 图像。我的图像优化器使用的工具之一是 truepng.exe。(可以在这里下载:http: //x128.ho.ua/clicks/clicks.php?uri= TruePNG_0625.zip

我只是创建了一个 nanoserver 容器并安装了一个包含 truepng.exe 的文件夹:

docker run --rm -it -v C:\data:C:\data mcr.microsoft.com/windows/nanoserver:2004-amd64

当我现在运行 truepng.exe 时,我期望一些关于缺少命令行参数的输出:

C:\MyLocalWindowsMachine>truepng
TruePNG 0.6.2.5 : PNG Optimizer
by x128 (2010-2017)
x128@ua.fm

...

但是,当我从 nanoserver docker 容器内部调用它时,我基本上看不到任何输出:

C:\data>truepng

C:\data>echo %ERRORLEVEL%
-1073741515

如上所示,退出代码设置为 -1073741515。据此,通常意味着缺少依赖项。

然后我下载了https://github.com/lucasg/Dependencies来查看 truepng 的依赖关系:

在此处输入图像描述

似乎它对 5 个 DLL 有一些依赖关系。查找这些我发现显然有一个叫做“反向转发器”的东西:https ://cloudblogs.microsoft.com/windowsserver/2015/11/16/moving-to-nano-server-the-new-deployment-option-in -windows-server-2016/

根据以下帖子,尽管它们应该已经包含在 nanoserver 中:https ://social.technet.microsoft.com/Forums/en-US/5b36a6d3-84c9-4940-8b7a-9e2a38468291/reverse-forwarders-package-in- tp5?forum=NanoServer

在所有这些调查之后,我也一直在尝试手动将 DLL 从我的本地机器(system32)复制到 docker 机器,但没有任何成功(它只是不断破坏其他东西,比如需要我重新创建容器的复制命令) . 除此之外,我还从 SysWOW64 复制了文件,但这也无济于事。

我目前对如何继续进行非常困惑,因为我什至不确定该工具是否缺少依赖项或者是否发生了其他事情。有没有办法在工具启动后调查缺少哪些 DLL?

亲切的问候,

德韦斯

编辑 1:来自@CherryDT 的想法 我尝试运行 gflags ( https://social.msdn.microsoft.com/Forums/en-US/f004a7e5-9024-4555-9ada-e692fbc3160d/how-to-start-quotloader-snapsquot? forum=vcgeneral),它给出了以下输出:

C:\data>"C:\data\gflags.exe" /i TruePNG.exe +sls
Current Registry Settings for TruePNG.exe executable are: 00000000

在此之后,我尝试运行 Dbgview.exe,但这从未导致写入日志文件:

C:\data>"C:\data\DebugView\Dbgview.exe" /v /l debugview-log.txt /g /n

C:\data>

我也再次启动了 TruePNG.exe,但同样没有写入日志文件。

我尝试使用 dotnet 核心应用程序查询事件日志,但这导致了以下异常:

Unhandled exception. System.InvalidOperationException: Cannot open log Application on computer '.'. This function is not supported on this system.
   at System.Diagnostics.EventLogInternal.OpenForRead(String currentMachineName)
   at System.Diagnostics.EventLogInternal.GetEntryAtNoThrow(Int32 index)
   at System.Diagnostics.EventLogEntryCollection.GetEntryAtNoThrow(Int32 index)
   at System.Diagnostics.EventLogEntryCollection.EntriesEnumerator.MoveNext()
   at EventLogReaderTest.ConsoleApp.Program.Main(String[] args) in C:\data\EventLogReaderTest.ConsoleApp\Program.cs:line 22
4

1 回答 1

4

Windows Nano Server 很小,仅支持 64 位应用程序、工具和代理。在这种情况下缺少的依赖是整个x86 仿真层 (WoW64),因为 TruePNG 是一个 32 位应用程序。

Windows Server Core 包含 Nano Server 中缺少的 WoW64 和其他组件。请改用Windows Server Core 映像

示例命令:

docker run --rm -it -v C:\Temp:C:\Temp mcr.microsoft.com/windows/servercore:2004 C:\Temp\TruePNG.exe

产生预期的输出:

TruePNG 0.6.2.5 : PNG Optimizer
by x128 (2010-2017)
x128@ua.fm

TruePNG {options} files

options:
/f#     PNG delta filters 0=None, 1=Sub, 2=Up, 3=Average, 4=Paeth, 5=Mixed
/fe     PNG extra filters, overrides /f switch
/i#     PNG interlace method 0=None, 1=Adam7 (default input)
/g#     PNG gamma 0=Remove, 1=Apply & Remove, 2=Keep (default)
[...]
于 2020-09-29T04:16:55.593 回答