web-dev-qa-db-ja.com

Windows機能NET-Framework-Dockerイメージの機能をインストールできません

.NET3.5を使用するローカルビルド環境からDockerイメージを作成しようとしています。機能を有効にしようとしましたが、エラーが発生します。

これは、問題を再現するための最小化されたDockerファイルです。

FROM mcr.Microsoft.com/dotnet/framework/sdk
RUN powershell "Install-WindowsFeature -Name NET-Framework-Features -Verbose"

これは出力です:

Sending build context to Docker daemon  72.74MB
Step 1/2 : FROM mcr.Microsoft.com/dotnet/framework/sdk
 ---> 88afad8be364
Step 2/2 : RUN powershell "Install-WindowsFeature -Name NET-Framework-Features -Verbose"
 ---> Running in 0a377584126e
VERBOSE: Installation started...
VERBOSE: Continue with installation?
VERBOSE: Prerequisite processing started...
VERBOSE: Prerequisite processing succeeded.
Install-WindowsFeature : The request to add or remove features on the
specified server failed.
Installation of one or more roles, role services, or features failed.
The service cannot be started, either because it is disabled or because it has
no enabled devices associated with it. Error: 0x80070422
At line:1 char:1
+ Install-WindowsFeature -Name NET-Framework-Features -Verbose
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (@{Vhd=; Credent...Name=localh
   ost}:PSObject) [Install-WindowsFeature], Exception
    + FullyQualifiedErrorId : DISMAPI_Error__Failed_To_Enable_Updates,Microsof
   t.Windows.ServerManager.Commands.AddWindowsFeatureCommand

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
False   No             Failed         {}
VERBOSE: Installation succeeded.


The command 'powershell -Command $ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; powershell "Install-WindowsFeature -Name NET-Framework-Features -Verbose"' returned a non-zero code: 1

インストールを試行せずにベアイメージをビルドして実行し(ステップ2/2)、3.5が表示される機能を確認することはオプションです。

C:\>powershell "Get-WindowsFeature net*"

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[ ] .NET Framework 3.5 Features                         NET-Framework-Features         Available
    [ ] .NET Framework 3.5 (includes .NET 2.0 and 3.0)  NET-Framework-Core               Removed
    [ ] HTTP Activation                                 NET-HTTP-Activation            Available
    [ ] Non-HTTP Activation                             NET-Non-HTTP-Activ             Available
[X] .NET Framework 4.8 Features                         NET-Framework-45-Fea...        Installed
    [X] .NET Framework 4.8                              NET-Framework-45-Core          Installed
    [ ] ASP.NET 4.8                                     NET-Framework-45-ASPNET        Available
    [X] WCF Services                                    NET-WCF-Services45             Installed
        [ ] HTTP Activation                             NET-WCF-HTTP-Activat...        Available
        [ ] Message Queuing (MSMQ) Activation           NET-WCF-MSMQ-Activat...        Available
        [ ] Named Pipe Activation                       NET-WCF-Pipe-Activat...        Available
        [ ] TCP Activation                              NET-WCF-TCP-Activati...        Available
        [X] TCP Port Sharing                            NET-WCF-TCP-PortShar...        Installed
[ ] Network Virtualization                              NetworkVirtualization            Removed

NET-Framework-45-ASPNETを有効にしようとしましたが、正常に機能しているように見えますが、Availableとしてリストされているのに対し、NET-Framework-CoreRemovedとしてリストされています。

Removed状態を修正する方法を詳しく調べると、.cabのあるフォルダーが提案されます-OSインストールISOからのファイルは-Sourceとしてリストする必要があります。ただし、cmd sysinfoによって返されるOS名は、対応するISOを持たないプレーンなMicrosoftを生成します。ダウンロードしてみました Windows Server 2019 ISO そしてそのsource/sxs-Sourceとして使用し、最高のものを期待していますが、同じ誤った結果と出力(新しいDockerfile)があります:

FROM mcr.Microsoft.com/dotnet/framework/sdk
# Copy sources/sxs from Windows Server 2016 ISO
COPY sources\sxs2016 C:\sources\sxs
RUN powershell "Install-WindowsFeature NET-Framework-Features -Source C:\sources\sxs -Verbose"

これを機能させる方法はありますか?

1
Andreas

ベースコンテナで無効になっているWindowsUpdateサービスを使用しようとしているため、エラーが発生しています。これは、ソースを含むローカルパスをインストーラーに直接提供する場合にも当てはまります。

元のDockerfileを機能させる最も簡単な変更は、インストール前にWindowsUpdateサービスを有効にすることです。

FROM mcr.Microsoft.com/dotnet/framework/sdk
RUN powershell "Set-Service -Name wuauserv -StartupType Manual; Install-WindowsFeature -Name NET-Framework-Features -Verbose"

同じアプローチは、.NET Framework3.5ソースがローカルにコピーされているPowershellスクリプトでも機能します。

Set-Service -Name wuauserv -StartupType "Manual"
write-output "Installing Windows Feature .net framework 35"
Install-WindowsFeature -Name NET-Framework-Features -Source C:\NET-Framework35-Features -Verbose

これは、単純さと保守性のために、Microsoftが公式イメージで使用しているものと比較して依然として好ましい場合があります。特定のバージョンを直接参照し、必要に応じてそれらを更新します。

3

Dockerfileで mcr.Microsoft.com/dotnet/framework/runtime:3.5 の解決策を見つけました:

# escape=`

FROM mcr.Microsoft.com/windows/servercore:1903

# Install .NET Fx 3.5
RUN curl -fSLo Microsoft-windows-netfx3.Zip https://dotnetbinaries.blob.core.windows.net/dockerassets/Microsoft-windows-netfx3-1903.Zip `
    && tar -zxf Microsoft-windows-netfx3.Zip `
    && del /F /Q Microsoft-windows-netfx3.Zip `
    && DISM /Online /Quiet /Add-Package /PackagePath:.\Microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~AMD64~~.cab `
    && del Microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~AMD64~~.cab `
    && powershell Remove-Item -Force -Recurse ${Env:TEMP}\*

# Apply latest patch
RUN curl -fSLo patch.msu http://download.windowsupdate.com/d/msdownload/update/software/updt/2019/09/windows10.0-kb4515871-x64_03a6aec54b0ca2fc40efcff09a810064f5d2ae60.msu `
    && mkdir patch `
    && expand patch.msu patch -F:* `
    && del /F /Q patch.msu `
    && DISM /Online /Quiet /Add-Package /PackagePath:C:\patch\Windows10.0-kb4515871-x64.cab `
    && rmdir /S /Q patch

# ngen .NET Fx
ENV COMPLUS_NGenProtectedProcess_FeatureEnabled 0
RUN \Windows\Microsoft.NET\Framework64\v2.0.50727\ngen uninstall "Microsoft.Tpm.Commands, Version=10.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=AMD64" `
    && \Windows\Microsoft.NET\Framework64\v2.0.50727\ngen update `
    && \Windows\Microsoft.NET\Framework\v2.0.50727\ngen update

私が試したものとの違いは次のように思われます。

  • 「Microsoftdockerassets」からnetfx3-on-demand-packageをダウンロードします。
  • DISMを使用してインストールし、ソースパスではなくパッケージパスを指定します。

Dockerfileはまた、ある種のパッチを適用し、ngenを更新します。 (関連性があるかどうかはわかりませんが、正直なところ、この魔術のレシピを変更するには恐れすぎます。)

1
Andreas