在 Windows 容器中安装 Visual Studio 是否可行?

66

是否可以在Windows Server的Windows容器中安装任何版本的Visual Studio?

动机是使用Windows容器构建连续集成系统中的软件,以便构建环境得到标准化。


你是否成功找到了对这个问题的满意答案? - Tamás Szelei
作为一种替代方案,可以在容器内运行Visual Studio Code。以下是官方文档:https://code.visualstudio.com/docs/remote/containers-tutorial - intrepidis
6个回答

31

Visual Studio 在 Core Server 上似乎没有官方支持, 但我同意能够这样做会非常好。让我们尝试:

FROM mcr.microsoft.com/windows/servercore:ltsc2019
SHELL ["powershell"]

RUN Invoke-WebRequest "https://aka.ms/vs/16/release/vs_community.exe" -OutFile "$env:TEMP\vs_community.exe" -UseBasicParsing
RUN & "$env:TEMP\vs_community.exe" --add Microsoft.VisualStudio.Workload.NetWeb --quiet --wait --norestart --noUpdateInstaller | Out-Default

RUN & 'C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/MSBuild.exe' /version

CMD ["powershell"]

我正在将这个图像推送到 lukaslansky/visualstudio-netwebworkload,请谨慎使用。

构建的输出结果为:

[...]
Microsoft (R) Build Engine version 15.3.409.57025 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

看起来这个方法可行!您应该尝试使用那些--add安装程序参数来准确指定构建所需的组件,它们对应于GUI中看到的工作负载和组件。请参阅文档。


需要使用“Windows Server Core”吗?如果您正在使用Windows的Docker,那么我不是可以直接运行它而不使用它作为基础吗? - Btc Sources
你需要选择一个在Docker世界中运行的基础镜像。我认为VS无法在Nano基础上存活。你知道其他选项吗? - Lukáš Lánský
2
我希望我能给你更多的赞,因为我已经搜索了几天这个解决方案。我终于有了一个Docker镜像,它可以构建.NET Framework 4.5,.NET Core 2.1和.NET Core 3.1。我所要做的就是拿到你的命令并启用一些额外的功能。 - Rob Spoor

6

1
它缺少一些工作负载,但如果你需要的都在那里,它是最好的选择。 - Skyblade
很遗憾,构建工具不再安装SSDT组件(或至少缺少一些重要组件)。我无法构建包含数据库项目的解决方案,所以我真的必须安装VS。:/ - timmkrause

4
一种在 Windows 容器中安装可视化构建链的方法是使用 Chocolatey 包 visualstudio2017buildtools。可以从以下 Dockerfile 开始:
FROM microsoft/windowsservercore
RUN powershell.exe -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SETX PATH "%PATH%;%ALLUSERSPROFILE%\chocolatey\bin" 
RUN choco install -y  visualstudio2017buildtools --package-parameters "--add Microsoft.VisualStudio.Workload.VCTools --installPath C:\BuildTools" || IF "%ERRORLEVEL%"=="3010" EXIT 0      
RUN call "C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat"

3
仅供参考,微软不打算在容器内支持VS,您最好的选择是MsBuild。几个月前还可以,但使用最新版本的VS已经不可能了。来源:vsts-agents

2

目前,Windows容器不支持GUI应用程序。这是由于Microsoft的限制,而不是Docker的限制。

例如,尝试运行像记事本这样简单的应用程序(在Windows Server Core容器中)。进程会启动,但没有GUI显示出来。

Notepad launched, but no GUI shows up


11
我认为在讨论 CI 场景时 GUI 并不相关。 - Lukáš Lánský

0

最近我花了很多时间研究这个问题,因为我们的目标是建立“dockerized” DevOps代理程序,能够运行VsBuild@1管道任务(以及其他任务)。

一般来说,如果你不需要VsBuild@1(或者其他与Visual Studio相关的任务,比如VsTest@2等),那么最好使用https://hub.docker.com/_/microsoft-dotnet-framework-sdk/作为基础镜像,然后就可以愉快地工作了;这些镜像已经安装了构建工具和VS测试代理。

但是,安装VS也是可能的。以下是一些注意事项:

  • 在上述提到的映像上安装VS时,我遇到了问题。由于某些原因,当它检测到已经存在某些工具时,VS会悄悄地无法复制一些文件。因此,我建议使用https://hub.docker.com/_/microsoft-dotnet-framework-runtime/映像作为基础。
  • 安装必须是“静默”的(因为没有GUI),不能请求重新启动。
  • 据我所知,VS通常会排队一些预构建过程,但当系统未重新启动时,不会触发这些过程。但可以通过运行%windir%\Microsoft.NET\Framework64\v4.0.30319\ngen update来手动触发它们。请注意,在Docker中安装VS会以各种方式导致其失败,因此您需要找到解决方法。
  • 查看SDK映像的原始DockerFile以获取一些参考;特别有趣的是.NET Framework targeting packs的手动安装:https://github.com/microsoft/dotnet-framework-docker/blob/main/src/sdk/4.8.1/windowsservercore-ltsc2022/Dockerfile (如果此链接因文件移动而停止工作,则值得查看https://github.com/microsoft/dotnet-framework-docker存储库中的DockerFile)
  • 无法安装所有VS组件!虽然我没有确定哪些组件有问题,但在Docker内进行完全的VS安装可能会超出默认的Docker磁盘空间限制和/或持续运行(某些进程将永远等待其他安装进程完成)。因此,重要的是仔细筛选您希望使用--add参数安装的VS组件ID列表。

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