Docker возвращает код завершения 3221225781 при установке vc_redist.x64.exe - PullRequest
0 голосов
/ 22 февраля 2020

Я видел много вопросов о коде выхода '3221225781' в ответ на docker RUN, но я все еще не могу найти ответ. Рассмотрим этот dockerfile:

FROM mcr.microsoft.com/dotnet/core/runtime:3.1
WORKDIR /app
ADD https://aka.ms/vs/16/release/vc_redist.x64.exe vc_redist.x64.exe
RUN VC_redist.x64.exe /install /quiet /norestart /log vc_redist.log

При запуске этого я получаю следующий вывод:

C:\test>docker image build -t exitcodetest:1.0 .
Sending build context to Docker daemon  113.2MB
Step 1/4 : FROM mcr.microsoft.com/dotnet/core/runtime:3.1
 ---> 3be5e0b7f3a5
Step 2/4 : WORKDIR /app
 ---> Using cache
 ---> 4508bead23e2
Step 3/4 : ADD https://aka.ms/vs/16/release/vc_redist.x64.exe vc_redist.x64.exe
Downloading [==================================================>]  15.06MB/15.06MB

 ---> 37322d63b677
Step 4/4 : RUN VC_redist.x64.exe /install /quiet /norestart /log vc_redist.log
 ---> Running in c57b67befa33
The command 'cmd /S /C VC_redist.x64.exe /install /quiet /norestart /log vc_redist.log' returned a non-zero code: 3221225781

Зачем мне этот код выхода? Что это значит? Я также подтвердил, что vc_redist.log не пишется.

Кто-нибудь знает, что я могу сделать, чтобы заставить это работать?

Я должен добавить, что команда работает, когда я запускаю ее на моем локальный компьютер, и возвращает ноль% ERRORLEVEL%.

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 мая 2020

@ ProfNimrod Мне нужно было использовать изображение с операционной системой, которую может использовать Azure, а не просто слой с NET. Итак, я начал с этого образа и в основном скопировал, как Microsoft устанавливает. NET. Мне нужно было сделать это таким образом, потому что мое приложение также устанавливает некоторые пользовательские драйверы в операционную систему. Возможно, есть лучший способ, но я его еще не видел.

# escape=`

# Use an Azure-supported image.
FROM mcr.microsoft.com/windows:1809-amd64

# Use PowerShell for the command shell because we will use it to install the .NET runtime
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]


# =================================================================
# Install .NET Core Runtime
# =================================================================

# Retrieve and install the .NET Core Runtime
RUN $dotnet_archive_file = 'C:\Windows\Temp\dotnet-runtime-3.1.2-win-x64.zip'; `
    $dotnet_archive_file_sha512 = '2986d9f04640115cfa1ec478ac20d8e5c0f3b57f1d4e379300dfbafe8d20ec775ea1987045d611a1b2d786de7e1981c57ef52824a9d8dda64e1570379187b23f'; `
    $dotnet_archive_url = 'https://dotnetcli.azureedge.net/dotnet/Runtime/3.1.2/dotnet-runtime-3.1.2-win-x64.zip'; `
    $dotnet_install_directory = 'C:\Program Files\dotnet'; `
    Invoke-WebRequest -OutFile $dotnet_archive_file $dotnet_archive_url; `
    if ((Get-FileHash $dotnet_archive_file -Algorithm sha512).Hash -ne $dotnet_archive_file_sha512) { `
        Write-Host \"CHECKSUM VERIFICATION FAILED: $dotnet_archive_url\"; `
        exit 1; `
    }; `
    Expand-Archive $dotnet_archive_file -DestinationPath $dotnet_install_directory; `
    Remove-Item -Force $dotnet_archive_file

# These common .NET-specific environment variables should be specified
ENV `
    # Configure web servers to bind to port 80 when present
    ASPNETCORE_URLS=http://+:80 `
    # Enable detection of running in a container
    DOTNET_RUNNING_IN_CONTAINER=true

# Update the global %PATH% to complete the .NET installation
# In order to set system PATH, ContainerAdministrator must be used
USER ContainerAdministrator
RUN $oldPath = [System.Environment]::GetEnvironmentVariable('path', [System.EnvironmentVariableTarget]::Machine); `
    $dotnet_install_directory = 'C:\Program Files\dotnet'; `
    $setx_process = Start-Process -FilePath 'setx.exe' -ArgumentList \"/M PATH \"\"$oldPath;$dotnet_install_directory\"\"\" -NoNewWindow -Wait -PassThru; `
    if ($setx_process.ExitCode -ne 0) { `
        Write-Host \"PROCESS FAILED: setx.exe (Exit Code: $($setx_process.ExitCode))\"; `
        exit 1; `
    }
USER ContainerUser
0 голосов
/ 22 февраля 2020

Я думаю, я понял это. Кажется, что изображение «mcr.microsoft.com/dotnet/core/runtime:3.1.1» является просто «слоем», который содержит только рецепт, необходимый для установки среды выполнения, но не содержит базовой спецификации ОС (пожалуйста, поправь меня если что не так). Поэтому сначала я должен предоставить ОС и установить ее, а затем применить среду выполнения. NET Core. Кажется, это работает:

FROM mcr.microsoft.com/windows/servercore:ltsc2019
WORKDIR /app
ADD https://aka.ms/vs/16/release/vc_redist.x64.exe vc_redist.x64.exe
RUN VC_redist.x64.exe /install /quiet /norestart /log vc_redist.log
FROM mcr.microsoft.com/dotnet/core/runtime:3.1.1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...