如何将带有自定义操作的 MSI 包安装到 Hyper-V 机器上的 Docker Windows 容器 运行 上?

How can I install MSI package with Custom Actions onto Docker Windows container running on Hyper-V machine?

我有一个 Hyper-V VM 运行ning Windows Server Core 2019 Standard 安装了 docker 和 运行 Windows 映像 mcr.microsoft.com/windows/servercore:ltsc2019(这将 运行 处于 process 隔离模式)。我尝试使用 msiexec 在该容器上安装我的应用程序(以静默模式)但总是失败,当 运行 宁自定义操作服务器时出现错误,这是日志:

MSI (s) (90:1C) [17:32:36:675]: Created Custom Action Server with PID 648 (0x288).
MSI (s) (90:1C) [17:32:36:769]: CA Server Process has terminated.
Action start 17:32:36: SchedServiceConfig.
MSI (s) (90:20) [17:32:36:817]: Note: 1: 1719 
CustomAction SchedServiceConfig returned actual error code 1601 (note this may not be 100% accurate if translation happened inside sandbox)

我尝试了其他一些安装程序(MySQL、PostgreSQL 等),它们最终都出现了同样的错误。我注意到自定义操作服务器总是立即启动和终止。但是没有自定义操作的安装程序可以成功安装(如cmake,git,...)。

我试过在我真机的Windows容器上安装这些(在process隔离模式下),都可以安装成功。

经过一番搜索,我尝试了图像 stefanscherer/chocolatey:0.10.15,它成功了。我使用 docker history 发现最近构建的 Windows 图像只有一层这样:

IMAGE               CREATED             CREATED BY                   SIZE                COMMENT
561b89eac394        4 weeks ago         Apply image ltsc2019-amd64   3.7GB                      

而图像 stefanscherer/chocolatey:0.10.15 有 2 个底层,如下所示:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
...             
<missing>           11 months ago       Install update ltsc2019-amd64                   1.18GB                     
<missing>           21 months ago       Apply image 1809-RTM-amd64                      3.47GB                     

我尝试了一些具有 2 层 Apply image 1809-RTM-amd64Install update ltsc2019-amd64 的图像(几个月前构建的图像),它们运行良好。

所以我的问题是:

  1. 是什么让具有 2 层的映像能够通过自定义操作安装 MSI?
  2. 如何构建我自己的 Windows 像上面那样的 2 层图像?
  3. 有没有办法安装 mcr.microsoft.com/windows/servercore:ltsc2019 的任何依赖项,以便它可以使用自定义操作安装 MSI?我想构建一个 Windows 映像可以安装我的 MSI 安装程序。

所以我终于想通了原因。自定义操作服务器进程是 32 位的,所以它总是在 运行 时崩溃,在 powershell 中尝试 C:\Windows\SysWOW64\cmd.exe 然后检查 echo $LASTEXITCODE 将是相同的结果。这是由 2020 年 2 月的新安全更新引起的,主机和容器 Windows 构建不匹配导致 32 位进程无提示崩溃并导致此问题。

来自微软的参考:

This issue was the result of a security change which required an interface change between user mode and kernel mode. Since process isolated containers share the kernel mode with the container host and the container images, user mode component without the update were both incompatible and unsecured with the new secured kernel interface.

https://support.microsoft.com/en-us/help/4542617/you-might-encounter-issues-when-using-windows-server-containers-with-t

解决方案

如果您 container/host 的构建版本是 2020 年 2 月之后的版本,只需将另一个 (host/container) 更新到 2020 年 2 月之后的较新版本