在构建过程中重新启动Docker容器

8

由于 dotnetfx,我需要在构建过程中重新启动 Docker 容器。 Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019

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

# Install Chocolatey
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# Universal Windows Platform build tools workload for Visual Studio 2019 Build Tools (https://chocolatey.org/packages/visualstudio2019-workload-universalbuildtools#dependencies)
RUN choco install visualstudio2019-workload-universalbuildtools --package-parameters "--includeOptional" --confirm

但是我面临着这个错误:
Packages requiring reboot:
 - dotnetfx (exit code 3010) # <--- it means a reboot is needed!

我尝试在同一个RUN命令中运行这两个命令,并在它们之间添加Restart-Computer(用\分隔),或者在每个安装命令后执行一个RUN命令,但是当我这样做时,Docker输出好像丢失了。
在构建过程中,我可以重新启动当前容器而不让Docker丢失并保持安装进程吗?
更新1 尝试在运行最后一个命令之前安装dotnetfx,但是我收到相同的错误。
# Microsoft .NET Framework (https://chocolatey.org/packages/dotnetfx)
RUN choco install dotnetfx --confirm

错误:

Packages requiring reboot:
 - dotnetfx (exit code 3010)

更新 2(解决方法)

我已经成功地使用一个已经安装了.NET的基础镜像解决了这个问题:

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8

我不知道你问题的答案,但另一个选择是尝试在本地安装此软件包,并使用COPY dockerfile命令将可执行文件复制到容器中。更好的选择是找到已经安装了该软件的Docker镜像。 - Bruno Farias
@BrunoFarias 谢谢,但这不是一个选项,因为这个 Dockerfile 有动态配置,所以我需要通过 Dockerfile 找出解决方法... - Idemax
注意,SDK镜像大小为10 GiB,而我通过使用ServerCore基础镜像和Chocolatey仅创建了所需内容的镜像,大小为5 GiB! - Yves Martin
3个回答

5

好的,看来你正在尝试安装VisualStudio 2019。这是我解决该问题的方法。 第一种方法是使用如上所述的多阶段构建:

FROM mcr.microsoft.com/windows/servercore:1809 as baseimage
RUN powershell -NoProfile -ExecutionPolicy Bypass -Command \    
     $Env:chocolateyVersion = '0.10.15' ; \
     $Env:chocolateyUseWindowsCompression = 'false' ; \
     "[Net.ServicePointManager]::SecurityProtocol = \"tls12, tls11, tls\"; iex ((New-Object System.Net.WebClient).DownloadString('http://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

# suppress the "restart required" error code (3010)
RUN choco install -y --ignore-package-exit-codes=3010 dotnetfx

# emulate the required restart after installing dotnetfx
FROM baseimage
RUN choco install -y visualstudio2019buildtools --package-parameters \
    "--norestart --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64"

那种方法存在问题,dotnetfx软件包似乎有问题 - 由于缺少“alink.dll”库,一些其他软件包无法安装。此外,我没有检查--ignore-package-exit-codes=3010是否仅抑制了一个错误或所有错误(choco文档没有说明可以指定确切的代码)。
第二种方法是从MS网站安装Visual Studio(完美运行)。
FROM mcr.microsoft.com/windows/servercore:1809

RUN powershell -NoProfile -ExecutionPolicy Bypass -Command \
    Invoke-WebRequest "https://aka.ms/vs/16/release/vs_community.exe" \
    -OutFile "%TEMP%\vs_community.exe" -UseBasicParsing

RUN "%TEMP%\vs_community.exe"  --quiet --wait --norestart --noUpdateInstaller \
    --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \
    --add Microsoft.VisualStudio.Component.Windows10SDK.18362

请注意,在您的情况下,组件可能会有所不同。

1
在Docker中不需要重新启动。唯一需要做的是告诉choco不要以非零退出代码退出。这可以通过 --ignore-package-exit-codes=3010 来完成。
以下内容对我有效:
FROM mcr.microsoft.com/windows/servercore:1809-amd64

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
RUN ["powershell","Set-ExecutionPolicy Bypass -Scope Process -Force;","iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))"]
RUN choco install dotnetfx -y --version 4.8.0.20190930 --ignore-package-exit-codes=3010
# see https://learn.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-build-tools?vs-2019&view=vs-2019 for a list of available workloads and components
RUN choco install visualstudio2019buildtools -y --version 16.8.1.0 --params \"--add Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools --add Microsoft.VisualStudio.Workload.NetCoreBuildTools\" 
RUN setx /M PATH $($Env:PATH+';C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/MSBuild/Current/bin/;c:/Program Files (x86)/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.8.0 Tools/')

0
解决这个问题的一种方法是使用多阶段构建。在第一阶段,您可以安装二进制文件,在第二阶段,您可以复制二进制文件并构建Docker镜像。
以下是如何实现此目标的步骤:https://docs.docker.com/develop/develop-images/multistage-build/ 示例
FROM mcr.microsoft.com/windows/servercore:ltsc2019 as baseimage

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

# Install Chocolatey
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# Universal Windows Platform build tools workload for Visual Studio 2019 Build Tools (https://chocolatey.org/packages/visualstudio2019-workload-universalbuildtools#dependencies)
FROM baseimage
RUN choco install visualstudio2019-workload-universalbuildtools --package-parameters "--includeOptional" --confirm

我有点理解多阶段构建,但你能否根据我的Dockerfile给我一个例子呢?我之所以问这个问题是因为这个错误发生在最后一个命令期间,所以我不确定这种方法是否有帮助... - Idemax
上述文件是否是整个文件,还有其他指令吗? - Al-waleed Shihadeh
我更新了答案,你可能需要将其拆分为多个阶段。 - Al-waleed Shihadeh
就像我之前所说的,重新启动的问题是在执行RUN choco install visualstudio2019-workload-universalbuildtools --package-parameters "--includeOptional" --confirm时抛出的,并不是在您分割的命令之间发生的... - Idemax
如果您尝试单独运行此命令,它将抛出相同的错误“RUN choco install dotnetfx --confirm”。 - Idemax

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