ืฉื™ืžื•ืฉ ื‘-docker multi-stage ืœื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Windows

ืฉืœื•ื ืœื›ื•ืœื! ืฉืžื™ ืื ื“ืจื™ื™, ื•ืื ื™ ืขื•ื‘ื“ ื›ืžื”ื ื“ืก DevOps ื‘-Exness ื‘ืฆื•ื•ืช ื”ืคื™ืชื•ื—. ื”ืคืขื™ืœื•ืช ื”ืขื™ืงืจื™ืช ืฉืœื™ ืงืฉื•ืจื” ืœื‘ื ื™ื™ื”, ืคืจื™ืกื” ื•ืชืžื™ื›ื” ื‘ืืคืœื™ืงืฆื™ื•ืช ื‘-docer ืชื—ืช ืžืขืจื›ืช ื”ื”ืคืขืœื” ืœื™ื ื•ืงืก (ืœื”ืœืŸ ืžืขืจื›ืช ื”ื”ืคืขืœื”). ืœื ืžื–ืžืŸ ื”ื™ื™ืชื” ืœื™ ืžืฉื™ืžื” ืขื ืื•ืชืŸ ืคืขื™ืœื•ื™ื•ืช, ืื‘ืœ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื™ืขื“ ืฉืœ ื”ืคืจื•ื™ืงื˜ ื”ื™ื™ืชื” Windows Server ื•ืžืขืจื›ืช ืฉืœ ืคืจื•ื™ืงื˜ื™ื ืฉืœ C++. ืขื‘ื•ืจื™, ื–ื• ื”ื™ื™ืชื” ื”ืื™ื ื˜ืจืืงืฆื™ื” ื”ืงืจื•ื‘ื” ื”ืจืืฉื•ื ื” ืขื ืงื•ื ื˜ื™ื™ื ืจื™ื ืฉืœ docker ืชื—ืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Windows ื•ื‘ืื•ืคืŸ ื›ืœืœื™, ืขื ื™ื™ืฉื•ืžื™ C++. ื”ื•ื“ื•ืช ืœื›ืš, ื”ื™ื™ืชื” ืœื™ ื—ื•ื•ื™ื” ืžืขื ื™ื™ื ืช ื•ืœืžื“ืชื™ ืขืœ ื›ืžื” ืžื”ืžื•ืจื›ื‘ื•ื™ื•ืช ืฉืœ ืื—ืกื•ืŸ ื™ื™ืฉื•ืžื™ื ื‘-Windows.

ืฉื™ืžื•ืฉ ื‘-docker multi-stage ืœื‘ื ื™ื™ืช ืชืžื•ื ื•ืช Windows

ื‘ืžืืžืจ ื–ื” ืื ื™ ืจื•ืฆื” ืœืกืคืจ ืœื›ื ืขื ืื™ืœื• ืงืฉื™ื™ื ื ืืœืฆืชื™ ืœื”ืชืžื•ื“ื“ ื•ืื™ืš ื”ืฆืœื—ืชื™ ืœืคืชื•ืจ ืื•ืชื. ืื ื™ ืžืงื•ื•ื” ืฉื–ื” ืžื•ืขื™ืœ ืขื‘ื•ืจ ื”ืืชื’ืจื™ื ื”ื ื•ื›ื—ื™ื™ื ื•ื”ืขืชื™ื“ื™ื™ื ืฉืœืš. ืงืจื™ืื” ืžื”ื ื”!

ืœืžื” ืžื›ื•ืœื•ืช?

ืœื—ื‘ืจื” ืชืฉืชื™ืช ืงื™ื™ืžืช ืขื‘ื•ืจ ืžืชื–ืžืจ ื”ืžื›ื•ืœื•ืช Hashicorp Nomad ื•ืจื›ื™ื‘ื™ื ื ืœื•ื•ื™ื - ืงื•ื ืกื•ืœ ื•ื›ืกืคืช. ืœื›ืŸ, ืžื™ื›ืœื™ ื™ื™ืฉื•ืžื™ื ื ื‘ื—ืจื” ื›ืฉื™ื˜ื” ืžืื•ื—ื“ืช ืœืืกืคืงืช ืคืชืจื•ืŸ ืกื•ื”ืจ. ืžืื—ืจ ืฉืชืฉืชื™ืช ื”ืคืจื•ื™ืงื˜ ืžื›ื™ืœื” ืžืืจื—ื™ docker ืขื Windows Server Core OS ื’ืจืกืื•ืช 1803 ื•- 1809, ื™ืฉ ืฆื•ืจืš ืœื‘ื ื•ืช ื’ืจืกืื•ืช ื ืคืจื“ื•ืช ืฉืœ ืชืžื•ื ื•ืช docker ืขื‘ื•ืจ 1803 ื•- 1809. ื‘ื’ืจืกื” 1803, ื—ืฉื•ื‘ ืœื–ื›ื•ืจ ืฉืžืกืคืจ ื”ื’ืจืกื” ืฉืœ ืžืืจื— ื”-build docker ื—ื™ื™ื‘ ืœื”ืชืื™ื ืœืžืกืคืจ ื”ื’ืจืกื” ืฉืœ ืชืžื•ื ืช ื”-docker ื”ื‘ืกื™ืกื™ืช ื•ืœืžืืจื— ืฉื‘ื• ื™ื•ืคืขืœ ื”ืžื›ื•ืœื” ืžืชืžื•ื ื” ื–ื•. ืœื’ืจืกื” 1809 ืื™ืŸ ื—ืกืจื•ืŸ ื›ื–ื”. ืืชื” ื™ื›ื•ืœ ืœืงืจื•ื ืขื•ื“ ื›ืืŸ.

ืœืžื” ืจื‘ ืฉืœื‘ื™?

ืœืžื”ื ื“ืกื™ ืฆื•ื•ืช ื”ืคื™ืชื•ื— ืื™ืŸ ื’ื™ืฉื” ืื• ืžื•ื’ื‘ืœืช ืžืื•ื“ ืœื‘ื ื™ื™ืช ืžืืจื—ื™ื; ืื™ืŸ ื“ืจืš ืœื ื”ืœ ื‘ืžื”ื™ืจื•ืช ืืช ืกื˜ ื”ืจื›ื™ื‘ื™ื ืœื‘ื ื™ื™ืช ืืคืœื™ืงืฆื™ื” ืขืœ ืžืืจื—ื™ื ืืœื”, ืœืžืฉืœ, ื”ืชืงื ืช ืขืจื›ืช ื›ืœื™ื ื ื•ืกืคืช ืื• ืขื•ืžืก ืขื‘ื•ื“ื” ืขื‘ื•ืจ Visual Studio. ืœื›ืŸ, ืงื™ื‘ืœื ื• ืืช ื”ื”ื—ืœื˜ื” ืœื”ืชืงื™ืŸ ืืช ื›ืœ ื”ืจื›ื™ื‘ื™ื ื”ื“ืจื•ืฉื™ื ืœื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื” ื‘ืชืžื•ื ืช ื”-build Docker. ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ืืชื” ื™ื›ื•ืœ ืœืฉื ื•ืช ื‘ืžื”ื™ืจื•ืช ืจืง ืืช ื”-docerfile ื•ืœื”ืคืขื™ืœ ืืช ื”ืฆื™ื ื•ืจ ืœื™ืฆื™ืจืช ืชืžื•ื ื” ื–ื•.

ืžื”ืชื™ืื•ืจื™ื” ืœืคืขื•ืœื”

ื‘ื‘ื ื™ื™ืช ืชืžื•ื ื” ืื™ื“ื™ืืœื™ืช ืฉืœ Docker ืžืจื•ื‘ื”-ืฉืœื‘ื™ื, ื”ืกื‘ื™ื‘ื” ืœื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื” ืžื•ื›ื ื” ื‘ืื•ืชื• ืกืงืจื™ืคื˜ Dockerfile ืฉื‘ื• ื ื‘ื ื™ืช ื”ืืคืœื™ืงืฆื™ื” ืขืฆืžื”. ืื‘ืœ ื‘ืžืงืจื” ืฉืœื ื•, ื ื•ืกืฃ ืงื™ืฉื•ืจ ื‘ื™ื ื™ื™ื, ื›ืœื•ืžืจ, ื”ืฉืœื‘ ืฉืœ ื™ืฆื™ืจื” ืจืืฉื•ื ื™ืช ืฉืœ ืชืžื•ื ืช docker ืขื ื›ืœ ื”ื“ืจื•ืฉ ืœื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื”. ื–ื” ื ืขืฉื” ื‘ื’ืœืœ ืฉืจืฆื™ืชื™ ืœื”ืฉืชืžืฉ ื‘ืชื›ื•ื ืช ืžื˜ืžื•ืŸ docker ื›ื“ื™ ืœื”ืคื—ื™ืช ืืช ื–ืžืŸ ื”ื”ืชืงื ื” ืฉืœ ื›ืœ ื”ืชืœื•ืช.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ื ืงื•ื“ื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉืœ ื”ืกืงืจื™ืคื˜ dockerfile ืœื™ืฆื™ืจืช ืชืžื•ื ื” ื–ื•.

ื›ื“ื™ ืœื™ืฆื•ืจ ืชืžื•ื ื•ืช ืฉืœ ื’ืจืกืื•ืช ืžืขืจื›ืช ื”ืคืขืœื” ืฉื•ื ื•ืช, ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืืจื’ื•ืžื ื˜ ื‘-docerfile ืฉื“ืจื›ื• ืžื•ืขื‘ืจ ืžืกืคืจ ื”ื’ืจืกื” ื‘ืžื”ืœืš ื”ื‘ื ื™ื™ื”, ื•ื”ื•ื ื’ื ื”ืชื’ ืฉืœ ืชืžื•ื ืช ื”ื‘ืกื™ืก.

ื ื™ืชืŸ ืœืžืฆื•ื ืจืฉื™ืžื” ืžืœืื” ืฉืœ ืชื’ื™ ืชืžื•ื ื” ืฉืœ 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';"]

ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ื”ืชืงื ืช ืžื ื”ืœ ื—ื‘ื™ืœื•ืช ื”ืฉื•ืงื•ืœื“ ื•ื”ื—ื‘ื™ืœื•ืช ื”ื“ืจื•ืฉื•ืช:

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'

ื›ื“ื™ ืœื”ืชืงื™ืŸ ื—ื‘ื™ืœื•ืช ื‘ืืžืฆืขื•ืช ืฉื•ืงื•ืœื“, ืืชื” ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื”ืขื‘ื™ืจ ืื•ืชืŸ ื›ืจืฉื™ืžื”, ืื• ืœื”ืชืงื™ืŸ ืื•ืชืŸ ืื—ืช ืื—ืช ืื ืืชื” ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจื™ื ื™ื™ื—ื•ื“ื™ื™ื ืœื›ืœ ื—ื‘ื™ืœื”. ื‘ืžืฆื‘ื ื•, ื”ืฉืชืžืฉื ื• ื‘ืงื•ื‘ืฅ ืžื ื™ืคืกื˜ ื‘ืคื•ืจืžื˜ 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++ ืฉืœื ื•, ื ืฆื˜ืจืš ืจื›ื™ื‘ื™ื ื ื•ืกืคื™ื, ื›ืœื•ืžืจ:

  • ืขื•ืžืก ืขื‘ื•ื“ื” ื›ืœื™ C++
  • ืขืจื›ืช ื›ืœื™ื 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"
  ]
}

ื”-docerfile ืžืจื™ืฅ ืืช ืกืงืจื™ืคื˜ ื”ื”ืชืงื ื”, ื•ืœืžืขืŸ ื”ื ื•ื—ื•ืช, ืžื•ืกื™ืฃ ืืช ื”ื ืชื™ื‘ ืœืงื‘ืฆื™ ื”ื”ืคืขืœื” ืฉืœ ื›ืœื™ ื”ื‘ื ื™ื™ื” ืœืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” 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 StudioInstaller' ;
    $env:PATH = 'C:Program Files (x86)Microsoft Visual Studio2019BuildToolsMSBuildCurrentBin;' + $env:PATH; 
    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, 
      [EnvironmentVariableTarget]::Machine)

ื‘ืฉืœื‘ ื–ื”, ื”ืชืžื•ื ื” ืฉืœื ื• ืขื‘ื•ืจ ืงื•ืžืคื™ืœืฆื™ื” ืฉืœ ืืคืœื™ืงืฆื™ื™ืช C++ ืžื•ื›ื ื”, ื•ื ื•ื›ืœ ืœื”ืžืฉื™ืš ื™ืฉื™ืจื•ืช ืœื™ืฆื™ืจืช ื‘ื ื™ื™ื” ืจื‘-ืฉืœื‘ื™ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื”.

ืจื‘ ืฉืœื‘ื™ ื‘ืคืขื•ืœื”

ืื ื• ื ืฉืชืžืฉ ื‘ืชืžื•ื ื” ืฉื ื•ืฆืจื” ืขื ื›ืœ ื”ื›ืœื™ื ืขืœ ื”ืกื™ืคื•ืŸ ื›ืชืžื•ื ืช ื‘ื ื™ื™ื”. ื›ืžื• ื‘ืกืงืจื™ืคื˜ ื”ืงื•ื“ื ืฉืœ 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 ื›ื“ื™ ืœื™ืฆื•ืจ ืชืžื•ื ื•ืช ืžืœืื•ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื•.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”