【问题标题】:Restart Docker container during build process在构建过程中重启 Docker 容器
【发布时间】:2020-02-18 19:35:23
【问题描述】:

由于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 镜像。
  • @BrunoFarias 谢谢,但是一旦有这个 Dockerfile 的动态配置,这不是一个选项,所以我需要通过 Dockerfile 来解决这个问题......
  • 请注意 sdk 映像大小为 10 GiB,而我设法创建了一个只有我需要的映像,这要感谢 servercore 基础映像和 5 GiB 的巧克力!

标签: powershell docker dockerfile restart docker-for-windows


【解决方案1】:

好的,看起来您正在尝试安装 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 doc 没有说明指定确切代码的可能性)。

第二种方法是从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

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

【讨论】:

    【解决方案2】:

    解决此问题的一种方法是使用多阶段构建。在第一阶段,您可以安装二进制文件,在第二阶段,您复制二进制文件并构建 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 的例子吗?我问它是因为发生此错误时是在最后一个命令期间,所以我不确定这种方法是否会有所帮助...
    • 上面的文件是整个文件还是有其他说明?
    • 我更新了答案,您可能需要将其拆分为多个阶段
    • 正如我之前所说,重启问题正在抛出,而 RUN choco install visualstudio2019-workload-universalbuildtools --package-parameters "--includeOptional" --confirm 不是在您拆分的命令之间执行...
    • 如果你尝试单独运行这个命令,它会抛出同样的错误RUN choco install dotnetfx --confirm
    【解决方案3】:

    在 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://docs.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/')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      相关资源
      最近更新 更多