Ke hoʻohana nei i ka docker multi-stage e kūkulu i nā kiʻi windows

Aloha kākou! ʻO Andrey koʻu inoa, a ke hana nei au ma ke ʻano he ʻenekini DevOps ma Exness i ka hui hoʻomohala. ʻO kaʻu hana koʻikoʻi e pili ana i ke kūkulu ʻana, ke kau ʻana a me ke kākoʻo ʻana i nā noi ma docker ma lalo o ka ʻōnaehana hana Linux (i kapa ʻia ʻo OS). ʻAʻole i liʻuliʻu, ua loaʻa iaʻu kahi hana me nā hana like, akā ʻo ka OS target o ka papahana ʻo Windows Server a me kahi hoʻonohonoho o nā papahana C++. Noʻu, ʻo kēia ka pilina pili mua me nā pahu docker ma lalo o Windows OS a, ma ka laulā, me nā noi C++. Mahalo i kēia, ua loaʻa iaʻu kahi ʻike hoihoi a aʻo e pili ana i kekahi o nā paʻakikī o ka hoʻopili ʻana i nā noi ma Windows.

Ke hoʻohana nei i ka docker multi-stage e kūkulu i nā kiʻi windows

Ma kēia ʻatikala makemake wau e haʻi iā ʻoe i nā pilikia aʻu i kū ai a pehea wau i hoʻoponopono ai iā lākou. Manaʻo wau he mea kōkua kēia no kāu mau pilikia o kēia manawa a me ka wā e hiki mai ana. Nanea i ka heluhelu!

No ke aha nā ipu?

Loaʻa i ka hui nā ʻōnaehana no ka Hashicorp Nomad container orchestrator a me nā ʻāpana pili - Consul and Vault. No laila, ua koho ʻia ka containerization no ka hoʻopuka ʻana i kahi hopena piha. No ka mea, loaʻa i ka ʻōnaehana papahana nā pūʻali docker me Windows Server Core OS versions 1803 a me 1809, pono e kūkulu i nā ʻano like ʻole o nā kiʻi docker no 1803 a me 1809. Ma ka mana 1803, he mea nui e hoʻomanaʻo i ka helu hoʻoponopono o ka hale hana docker build. pono e kūlike me ka helu hoʻoponopono o ke kiʻi docker kumu a me ka mea hoʻokipa kahi e hoʻokuʻu ʻia ai ka pahu mai kēia kiʻi. ʻAʻohe o ia drawback o ka version 1809. Hiki iā ʻoe ke heluhelu hou aku maanei.

No ke aha he nui-pae?

ʻAʻohe a i ʻole liʻiliʻi loa o ka poʻe ʻenekinia hui hoʻomohala e kūkulu i nā pūʻali; ʻaʻohe ala e hoʻokele wikiwiki ai i ka hoʻonohonoho o nā ʻāpana no ke kūkulu ʻana i kahi noi ma kēia mau pūʻali, no ka laʻana, e hoʻokomo i kahi hāmeʻa hou a i ʻole nā ​​​​hana hana no Visual Studio. No laila, ua hoʻoholo mākou e hoʻokomo i nā ʻāpana āpau e pono ai e kūkulu i ka noi i ke kiʻi kūkulu Docker. Inā pono, hiki iā ʻoe ke hoʻololi koke i ka dockerfile a hoʻomaka i ka pipeline no ka hana ʻana i kēia kiʻi.

Mai ka manaʻo i ka hana

Ma kahi kiʻi kiʻi nui Docker maikaʻi loa, ua hoʻomākaukau ʻia ke kaiapuni no ke kūkulu ʻana i ka noi ma ka palapala Dockerfile like me ke kūkulu ʻia ʻana o ka noi ponoʻī. Akā i kā mākou hihia, ua hoʻohui ʻia kahi loulou waena, ʻo ia hoʻi, ka pae o ka hana mua ʻana i kahi kiʻi docker me nā mea āpau e pono ai e kūkulu i ka noi. Ua hana ʻia kēia no ka mea makemake wau e hoʻohana i ka hiʻohiʻona docker cache e hōʻemi i ka manawa hoʻonohonoho o nā hilinaʻi āpau.

E nānā i nā kumu nui o ka palapala dockerfile no ka hana ʻana i kēia kiʻi.

No ka hana ʻana i nā kiʻi o nā ʻano OS like ʻole, hiki iā ʻoe ke wehewehe i kahi hoʻopaʻapaʻa ma ka dockerfile kahi i hala ai ka helu helu i ka wā o ke kūkulu ʻana, a ʻo ia hoʻi ka hōʻailona o ke kiʻi kumu.

Hiki ke loaʻa kahi papa inoa piha o nā kiʻi kiʻi Microsoft Windows Server maanei.

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

Ma ka paʻamau nā kauoha i nā kuhikuhi RUN i loko o ka dockerfile ma Windows OS ua hoʻokō ʻia lākou i ka console cmd.exe. No ka maʻalahi o ke kākau ʻana i nā palapala a me ka hoʻonui ʻana i ka hana o nā kauoha i hoʻohana ʻia, e wehewehe hou mākou i ka console hoʻokō kauoha ma Powershell ma o ke aʻo ʻana. SHELL.

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

ʻO ka ʻanuʻu aʻe e hoʻokomo i ka luna chocolatey package manager a me nā pūʻolo pono:

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'

No ka hoʻokomo ʻana i nā pūʻolo me ka chocolatey, hiki iā ʻoe ke hāʻawi wale iā lākou ma ke ʻano he papa inoa, a i ʻole e hoʻokomo iā lākou i kēlā me kēia manawa inā pono ʻoe e hāʻawi i nā ʻāpana kūʻokoʻa no kēlā me kēia pūʻolo. I ko mākou kūlana, ua hoʻohana mākou i kahi faila i hōʻike ʻia ma ka format XML, aia kahi papa inoa o nā pūʻolo koi a me kā lākou mau palena. Penei kona mau mea:

<?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>

Ma hope aʻe, hoʻokomo mākou i ke kaiapuni kūkulu noi, ʻo ia hoʻi, MS Build Tools 2019 - he ʻano māmā kēia o Visual Studio 2019, aia ka liʻiliʻi i koi ʻia o nā ʻāpana no ka hōʻuluʻulu ʻana i nā code.
No ka hana piha me kā mākou papahana C++, pono mākou i nā ʻāpana ʻē aʻe, ʻo ia hoʻi:

  • Nā mea hana C++ hoʻouka hana
  • Mea hana v141
  • Windows 10 SDK (10.0.17134.0)

Hiki iā ʻoe ke hoʻouka i kahi pūʻulu o nā mea hana me ka hoʻohana ʻana i kahi faila hoʻonohonoho ma JSON format. Nā maʻiʻo waihona hoʻonohonoho:

Hiki ke loaʻa kahi papa inoa piha o nā mea i loaʻa ma ka pūnaewele palapala ʻO 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"
  ]
}

Ke holo nei ka dockerfile i ka palapala hoʻonohonoho, a no ka maʻalahi, hoʻohui i ke ala i nā mea hana hana i hiki ke hoʻokō ʻia i nā faila i ka loli kaiapuni. PATH. He mea maikaʻi hoʻi e wehe i nā faila pono ʻole a me nā papa kuhikuhi e hōʻemi i ka nui o ke kiʻi.

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)

I kēia pae, ua mākaukau kā mākou kiʻi no ka hoʻopili ʻana i ka noi C++, a hiki iā mākou ke hoʻomau pololei i ka hana ʻana i kahi docker multi-stage build o ka noi.

Nui-pae i ka hana

E hoʻohana mākou i ke kiʻi i hana ʻia me nā mea hana a pau ma luna o ka moku e like me ke kiʻi kūkulu. E like me ka palapala dockerfile mua, e hoʻohui mākou i ka hiki ke hoʻohālikelike i ka helu helu / kiʻi kiʻi no ka maʻalahi o ka hoʻohana hou ʻana. He mea nui e hoʻohui i kahi lepili as builder i ke kiʻi hui ma nā kuhikuhi FROM.

ARG WINDOWS_OS_VERSION=1809
FROM buildtools:$WINDOWS_OS_VERSION as builder

ʻO ka manawa kēia e kūkulu ai i ka noi. He mea maʻalahi loa nā mea a pau: kope i ke code kumu a me nā mea a pau e pili ana me ia, a hoʻomaka i ke kaʻina hana.

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

ʻO ka pae hope loa o ka hana ʻana i ke kiʻi hope loa, ʻo ia ke kuhikuhi i ke kiʻi kumu o ka noi, kahi e loaʻa ai nā mea kiʻi hoʻohui a me nā faila hoʻonohonoho. No ke kope ʻana i nā faila i hōʻuluʻulu ʻia mai ke kiʻi hui waena, pono ʻoe e kuhikuhi i ka ʻāpana --from=builder ma na kuhikuhi COPY.

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

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

ʻO nā mea a pau i koe e hoʻohui i nā hilinaʻi pono no kā mākou noi e hana a kuhikuhi i ke kauoha hoʻomaka ma o nā kuhikuhi ENTRYPOINT ai ole ia, CMD.

hopena

Ma kēia ʻatikala, ua kamaʻilio wau e pili ana i ka hana ʻana i kahi kaiapuni hoʻohui piha piha no nā noi C ++ i loko o kahi pahu Windows a pehea e hoʻohana ai i nā mana o docker multi-stage builds e hana i nā kiʻi piha piha o kā mākou noi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka