在 Docker 容器上安装 MSI

14
需要帮助将遗留应用程序Docker化 我有一个包含多个组件(msi安装程序)的遗留应用程序。这些组件使用各种技术,如C#,Windows窗体,C++,MFC,.net remoting和C# Web服务(asmx)。其中有一些组件是桌面UI应用程序。 我正在研究将这些组件Docker化的可行性。我知道无法从Docker容器中显示UI,但是UI组件也有命令行对应项,可以使用它来执行所有可以在UI中完成的操作。 我从一个简单组件开始。这个组件包含由C#开发的asmx Web服务,通常托管在Windows机器上的IIS上。 它将其文件安装到以下位置

  1. C:\program Files\ ==> 可配置
    1. C:\programData\

我使用以下操作创建了docker文件

  1. 获取Windows Server Core映像并启用IIS和其他依赖项
    1. 将安装程序从主机机器复制到容器
    2. 使用msiexec命令以静默模式运行安装程序。

当我使用此Docker文件运行docker build命令时,我收到了一个错误信息:无法访问网络位置"C:\Program Files\\

谷歌没有提供任何帮助。 有人能帮我解决这个问题吗? 我有几个问题 1. Docker容器默认包含像Program Files、Program Files(x86)、User Profile、Program data和App data这样的默认Windows目录吗?

编辑: 抱歉回复延迟。 提供以下docker文件:

FROM microsoft/aspnet
WORKDIR C:\\Installers
COPY EKBCS.exe C:\\Installers\\myinstaller.exe
COPY EKBCS.properties C:\\Installers\\myinstaller.properties
#RUN msiexec /unreg
#RUN msiexec /regserver
#RUN ["net start", "msiserver"]
RUN ["myinstaller.exe", "/l*v myinstaller.log",  "/qn PROPERTYFILE=myinstaller.properties"]
ENTRYPOINT ["powershell"]

以下是安装程序日志中的错误。

-- 错误 1719。无法访问Windows Installer服务。这可能是因为您正在安全模式下运行Windows,或者Windows Installer未正确安装。联系您的支持人员寻求帮助。

我尝试注销并注册msi安装程序服务,但没有帮助。因此,我注释了那些行。非常感谢任何帮助。


1
windowsservercore 镜像已经包含了 Program Files、Program Files(x86) 和其他目录。您可以通过在使用命令 docker run -it microsoft/windowsservercore:latest 直接创建的容器上运行 dir 命令来查找更多内容。 - KatariaA
1个回答

8

我在2年前做过类似的工作,将我们组织中的一些C#代码进行了docker化。
这里是一个Dockerfile片段,它可以帮助你实现你要做的事情 -

FROM microsoft/windowsservercore

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

#Copy installers
RUN (New-Object System.Net.WebClient).DownloadFile('https://download.microsoft.com/download/B/4/A/B4A8422F-C564-4393-80DA-6865A8C4B32D/MicrosoftAzureAuthoringTools-x64.msi', 'c:\tools\MicrosoftAzureAuthoringTools-x64.msi') ;\
    (New-Object System.Net.WebClient).DownloadFile('https://download.microsoft.com/download/B/4/A/B4A8422F-C564-4393-80DA-6865A8C4B32D/MicrosoftAzureLibsForNet-x64.msi', 'c:\tools\MicrosoftAzureLibsForNet-x64.msi') ;\
    Start-Process 'msiexec' -ArgumentList '/i c:\tools\MicrosoftAzureAuthoringTools-x64.msi /quiet /qn /norestart /log c:\tools\installAuth.log'; \
    Start-Sleep -s 30 ;\
    Start-Process 'msiexec' -ArgumentList '/i c:\tools\MicrosoftAzureLibsForNet-x64.msi /quiet /qn /norestart /log c:\tools\installLib.log';\
    Start-Sleep -s 30 ;\
    Remove-Item c:\tools\*.msi -force

我的示例从互联网下载文件,然后从已下载到的 c:\tools 文件夹安装它们,但这样做也同样有效,并且消除了对主机上存在的文件的依赖。
希望能有所帮助。


1
我似乎在将程序安装到C:\program Files目录时遇到了问题。这些安装是否会进入C:\program Files目录? - Satish
它目前并没有成功安装您的msi文件,但它应该可以成功安装,从而使您当前遇到的错误变得无关紧要。正如其他人在问题评论中提到的那样 - 如果您粘贴您的dockerfile,我们可能能够帮助您安装特定的msi文件,以解决您遇到的问题。 - Yaron Idan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接