การใช้นักเทียบท่าหลายขั้นตอนเพื่อสร้างอิมเมจของ windows

สวัสดีทุกคน! ฉันชื่อ Andrey และฉันทำงานเป็นวิศวกร DevOps ที่ Exness ในทีมพัฒนา กิจกรรมหลักของฉันเกี่ยวข้องกับการประกอบ การปรับใช้ และการสนับสนุนแอปพลิเคชันในนักเทียบท่าภายใต้ระบบปฏิบัติการ Linux (ต่อไปนี้จะเรียกว่าระบบปฏิบัติการ) เมื่อไม่นานมานี้ฉันมีงานกิจกรรมเดียวกัน แต่ Windows Server และชุดของโครงการใน C ++ กลายเป็นระบบปฏิบัติการเป้าหมายของโครงการ สำหรับฉัน นี่เป็นการโต้ตอบอย่างใกล้ชิดครั้งแรกกับคอนเทนเนอร์นักเทียบท่าภายใต้ระบบปฏิบัติการ Windows และโดยทั่วไปกับแอปพลิเคชัน C ++ ด้วยเหตุนี้ ฉันจึงได้รับประสบการณ์ที่น่าสนใจและได้เรียนรู้เกี่ยวกับความซับซ้อนบางประการของแอปพลิเคชันคอนเทนเนอร์ใน Windows

การใช้นักเทียบท่าหลายขั้นตอนเพื่อสร้างอิมเมจของ windows

ในบทความนี้ฉันอยากจะบอกคุณว่าฉันต้องเจอกับปัญหาอะไรบ้าง ฉันจะแก้ปัญหาเหล่านี้ได้อย่างไร ฉันหวังว่าสิ่งนี้จะเป็นประโยชน์สำหรับความต้องการในปัจจุบันและอนาคตของคุณ สนุกกับการอ่าน!

ทำไมต้องตู้คอนเทนเนอร์?

บริษัทมีโครงสร้างพื้นฐานที่มีอยู่สำหรับ Hashicorp Nomad container orchestrator และส่วนประกอบที่เกี่ยวข้อง Consul and Vault ดังนั้น การทำให้คอนเทนเนอร์ของแอปพลิเคชันถูกเลือกเป็นวิธีการแบบครบวงจรสำหรับการส่งมอบโซลูชันแบบเบ็ดเสร็จ เนื่องจากโครงสร้างพื้นฐานของโครงการมีโฮสต์นักเทียบท่าที่มี Windows Server Core OS เวอร์ชัน 1803 และ 1809 จึงจำเป็นต้องสร้างอิมเมจนักเทียบท่าเวอร์ชันแยกต่างหากสำหรับ 1803 และ 1809 ในเวอร์ชัน 1803 สิ่งสำคัญคือต้องจำไว้ว่าหมายเลขการแก้ไขของโฮสต์นักเทียบท่าบิลด์ ต้องตรงกับหมายเลขการแก้ไขของอิมเมจนักเทียบท่าฐานและโฮสต์ที่จะเปิดใช้งานคอนเทนเนอร์จากอิมเมจนี้ เวอร์ชัน 1809 ไม่มีข้อเสียนี้ อ่านเพิ่มเติม ที่นี่.

ทำไมต้องหลายขั้นตอน?

วิศวกรของทีมพัฒนาไม่มีหรือจำกัดการเข้าถึงในการสร้างโฮสต์ ไม่มีวิธีจัดการชุดส่วนประกอบสำหรับการสร้างแอปพลิเคชันบนโฮสต์เหล่านี้ได้อย่างรวดเร็ว เช่น ติดตั้งชุดเครื่องมือเพิ่มเติมหรือปริมาณงานสำหรับ Visual Studio ดังนั้นเราจึงตัดสินใจ - ติดตั้งส่วนประกอบทั้งหมดที่จำเป็นสำหรับการสร้างแอปพลิเคชันในอิมเมจนักเทียบท่าแอสเซมบลี หากจำเป็น คุณสามารถเปลี่ยนเฉพาะไฟล์นักเทียบท่าได้อย่างรวดเร็วและเรียกใช้ไปป์ไลน์เพื่อสร้างอิมเมจนี้

จากทฤษฎีสู่ธุรกิจ

ในการสร้างอิมเมจแบบหลายขั้นตอนของ docker ที่เหมาะสมที่สุด สภาพแวดล้อมสำหรับการสร้างแอปพลิเคชันนั้นถูกจัดเตรียมไว้ในสคริปต์ dockerfile เดียวกันกับการสร้างแอปพลิเคชันเอง แต่ในกรณีของเรา มีการเพิ่มลิงก์ระหว่างกลาง กล่าวคือ ขั้นตอนการสร้างอิมเมจนักเทียบท่าล่วงหน้าพร้อมทุกสิ่งที่จำเป็นในการสร้างแอปพลิเคชัน สิ่งนี้ทำขึ้นเพราะฉันต้องการใช้คุณสมบัติแคชนักเทียบท่าเพื่อลดเวลาการติดตั้งสำหรับการขึ้นต่อกันทั้งหมด

มาดูประเด็นหลักของสคริปต์ dockerfile ในการสร้างอิมเมจนี้กัน

หากต้องการสร้างอิมเมจของ OS เวอร์ชันต่างๆ ในไฟล์ 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';"]

ขั้นตอนต่อไปคือการติดตั้งตัวจัดการแพ็คเกจช็อกโกแลตและแพ็คเกจที่จำเป็น:

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"
  ]
}

ไฟล์นักเทียบท่าดำเนินการสคริปต์การติดตั้ง และเพื่อความสะดวก เส้นทางไปยังไฟล์ปฏิบัติการเครื่องมือสร้างจะถูกเพิ่มไปยังตัวแปรสภาพแวดล้อม 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 เพื่อสร้างอิมเมจที่สมบูรณ์ของแอปพลิเคชันของเรา

ที่มา: will.com

เพิ่มความคิดเห็น