Verwenden von Docker mehrstufig zum Erstellen von Windows-Images

Hallo alle zusammen! Mein Name ist Andrey und ich arbeite als DevOps-Ingenieur bei Exness im Entwicklungsteam. Meine Haupttätigkeit bezieht sich auf das Zusammenstellen, Bereitstellen und Unterstützen von Anwendungen in Docker unter dem Linux-Betriebssystem (im Folgenden als Betriebssystem bezeichnet). Vor nicht allzu langer Zeit hatte ich eine Aufgabe mit denselben Aktivitäten, aber Windows Server und eine Reihe von C ++ - Projekten wurden zum Zielbetriebssystem des Projekts. Für mich war dies die erste enge Interaktion mit Docker-Containern unter Windows und im Allgemeinen mit C ++ - Anwendungen. Dank dessen habe ich interessante Erfahrungen gesammelt und einige der Feinheiten der Containerisierung von Anwendungen unter Windows kennengelernt.



In diesem Artikel möchte ich Ihnen sagen, mit welchen Schwierigkeiten ich konfrontiert war und wie sie gelöst wurden. Ich hoffe, dass dies nützlich ist, um Ihre aktuellen und zukünftigen Aufgaben zu lösen. Viel Spaß beim Lesen!


Warum Container?


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