经过很多个小时的反复试验和互联网搜索,我可以很高兴地说我成功地将 Access Runtime 安装在 Docker 容器上。的回应这个线程 https://answers.microsoft.com/en-us/windows/forum/windows_10-windows_install/problem-activation-error-0xc0020036-windows-10/85126b3c-8476-4310-83bf-4d9c7801d39b引导我走向正确的方向。
太阳、月亮和星星必须全部对齐才能使其发挥作用,所以我希望这个答案对将来的人有所帮助。
首先,作为记录,我使用的是基础图像来自 mcr.microsoft.com/windows:1809-amd64,可部署到 Azure。不幸的是,服务器核心映像不是一个选项,因为 Access 数据库引擎(我拥有的一个单独的依赖项)不适用于服务器核心。
其次,在安装过程中您必须使用用户容器管理员.
第三,在运行 setup.exe 之前,您必须设置此注册表项:
reg.exe add HKLM\System\CurrentControlSet\Services\sppsvc /v Start /t REG_DWORD /d 2 /f
我不完全知道这是做什么的,但与激活有关。它将操作系统置于足以安装 Access Runtime 的状态。这是我在那条线上得到的作品。
默认情况下该值为 4,这会将值设置为 2。安装后我没有将其恢复为 4,也没有测试它。
另一个重要的一点是,设置此注册表设置必须位于RUN声明之前且独立于RUN它将启动 setup.exe。这是因为设置后需要重新启动。这意味着无法单独从 shell 手动测试这一点,而必须使用 Dockerfile 来进行端到端测试。
第四,启动 setup.exe 时,您必须以非常特定的方式启动它:
RUN cmd.exe /C setup.exe /config temp.log
这里重要的是额外的cmd.exe /C。原因是如果您没有 cmd.exe /C,setup.exe 会启动一个新的 shell 并立即返回。这意味着该操作立即返回给 Docker,并进入一种奇怪的状态。我花了一段时间才弄清楚这一点。 cmd.exe /C 允许它充分等待。事实上,我使用 PowerShell 只是为了更加确定:
$access_runtime_setup_process = Start-Process -FilePath 'cmd.exe' -ArgumentList \"/C $access_runtime_temp_directory\setup.exe /config $access_runtime_config_file\" -NoNewWindow -Wait -PassThru; `
if ($access_runtime_setup_process.ExitCode -ne 0) { `
Write-Host \"PROCESS FAILED: $access_runtime_temp_directory\setup.exe (Exit Code: $($access_runtime_setup_process.ExitCode))\"; `
exit 1; `
}
最后,我在 Access 运行时之后安装了 Access 数据库引擎。我没有测试相反的方法,它可能也有效。
安装 Access 数据库引擎后,我做了一个USER 容器用户来恢复用户。
我不需要安装 VC Runtime 或 .NET Framework,我唯一需要安装的是运行时和数据库引擎。
如果其他人最终不得不经历在 Docker 容器中使用 Access 等遗留软件的痛苦,我希望这对您有所帮助!