Utilisation de Docker en plusieurs étapes pour créer des images Windows

Bonjour à tous! Je m'appelle Andrey et je travaille en tant qu'ingénieur DevOps chez Exness au sein de l'équipe de développement. Mon activité principale est liée au montage, au déploiement et au support d'applications en docker sous le système d'exploitation Linux (ci-après dénommé l'OS). Il n'y a pas si longtemps, j'avais une tâche avec les mêmes activités, mais Windows Server et un ensemble de projets C ++ sont devenus le système d'exploitation cible du projet. Pour moi, ce fut la première interaction étroite avec les conteneurs Docker sous Windows et en général avec les applications C ++. Grâce à cela, j'ai acquis une expérience intéressante et découvert certaines des subtilités des applications de conteneurisation sous Windows.



Dans cet article, je veux vous dire quelles difficultés j'ai dû affronter, comment elles ont été résolues. J'espère que cela vous sera utile pour résoudre vos tâches actuelles et futures. Bonne lecture!


Pourquoi des conteneurs?


Hashicorp Nomad — Consul Vault. . docker- Windows Server Core 1803 1809, docker- 1803 1809. 1803 , docker- docker- , . 1809 . .


multi-stage?


, , , toolset workload Visual Studio. — docker-. dockerfile .



docker multi-stage dockerfile , . , , docker- . , docker cache, .


dockerfile .


dockerfile , , .


Microsoft Windows Server .

ARG WINDOWS_OS_VERSION=1809
FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION

RUN dockerfile Windows cmd.exe. Powershell SHELL.


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

chocolatey :


COPY chocolatey.pkg.config .
RUN Set-ExecutionPolicy Bypass -Scope Process -Force ;\
    [System.Net.ServicePointManager]::SecurityProtocol = \
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 ;\
    $env:chocolateyUseWindowsCompression = 'true' ;\
    iex ((New-Object System.Net.WebClient).DownloadString( \
      'https://chocolatey.org/install.ps1')) ;\
    choco install chocolatey.pkg.config -y --ignore-detected-reboot ;\
    if ( @(0, 1605, 1614, 1641, 3010) -contains $LASTEXITCODE ) { \
      refreshenv; } else { exit $LASTEXITCODE; } ;\
    Remove-Item 'chocolatey.pkg.config'

, chocolatey, , . XML, . :


<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="python" version="3.8.2"/>
  <package id="nuget.commandline" version="5.5.1"/>
  <package id="git" version="2.26.2"/>
</packages>

, , MS Build Tools 2019 — Visual Studio 2019, .
C++ , :


  • Workload C++ tools
  • Toolset v141
  • Windows 10 SDK (10.0.17134.0)

JSON. :


Microsoft Visual Studio.

{
  "version": "1.0",
  "components": [
    "Microsoft.Component.MSBuild",
    "Microsoft.VisualStudio.Workload.VCTools;includeRecommended",
    "Microsoft.VisualStudio.Component.VC.v141.x86.x64",
    "Microsoft.VisualStudio.Component.Windows10SDK.17134"
  ]
}

dockerfile , build tools PATH. , .


COPY buildtools.config.json .
RUN Invoke-WebRequest 'https://aka.ms/vs/16/release/vs_BuildTools.exe' \
      -OutFile '.\vs_buildtools.exe' -UseBasicParsing ;\
    Start-Process -FilePath '.\vs_buildtools.exe' -Wait -ArgumentList \
      '--quiet --norestart --nocache --config C:\buildtools.config.json' ;\
    Remove-Item '.\vs_buildtools.exe' ;\
    Remove-Item '.\buildtools.config.json' ;\
    Remove-Item -Force -Recurse \
      'C:\Program Files (x86)\Microsoft Visual Studio\Installer' ;\
    $env:PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin;' + $env:PATH; \
    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, \
      [EnvironmentVariableTarget]::Machine)

C++ , docker multi-stage .


Multi-stage


. dockerfile , / . as builder FROM.


ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

. : , , .


COPY myapp .
RUN nuget restore myapp.sln ;\
    msbuild myapp.sln /t:myapp /p:Configuration=Release

— , . --from=builder COPY.


FROM mcr.microsoft.com/windows/servercore:$WINDOWS_OS_VERSION

COPY --from=builder C:/x64/Release/myapp/ ./
COPY ./configs ./

ENTRYPOINT CMD.



, C++ Windows , docker multi-stage .


All Articles