เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ docker เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš windows

เบชเบฐเบšเบฒเบเบ”เบตเบ—เบธเบเบ„เบปเบ™! เบ‚เป‰เบญเบเบŠเบทเปˆ Andrey, เปเบฅเบฐเบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เบงเบดเบชเบฐเบงเบฐเบเบญเบ™ DevOps เบขเบนเปˆ Exness เปƒเบ™เบ—เบตเบกเบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบเบดเบ”เบˆเบฐเบเปเบฒเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบกเปˆเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, เบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™ docker เบžเบฒเบเปƒเบ•เป‰เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ Linux (เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ OS). เบšเปเปˆเบ”เบปเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ‚เป‰เบญเบเบกเบตเบงเบฝเบเบ—เบตเปˆเบกเบตเบเบดเบ”เบˆเบฐเบเปเบฒเบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆ OS เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™ Windows Server เปเบฅเบฐเบŠเบธเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ C ++. เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบ, เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆเบžเบปเบงเบžเบฑเบ™เบขเปˆเบฒเบ‡เปƒเบเป‰เบŠเบดเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบเบฑเบš docker containers เบžเบฒเบเปƒเบ•เป‰ Windows OS เปเบฅเบฐ, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ C ++. เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบฅเบฐเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบšเบฑเบ™เบˆเบธเปƒเบ™ Windows.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ docker เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš windows

เปƒเบ™โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบšเบญเบโ€‹เบ—เปˆเบฒเบ™โ€‹เบงเปˆเบฒโ€‹เบ„เบงเบฒเบกโ€‹เบซเบเบธเป‰เบ‡โ€‹เบเบฒเบโ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบ›เบฐโ€‹เป€เบŠเบตเบ™โ€‹เบเบฑเบšโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบˆเบฑเบ”โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบกเบฑเบ™โ€‹. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบ›เบฐโ€‹เป‚เบซเบเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ—เป‰เบฒโ€‹เบ—เบฒเบโ€‹เปƒเบ™โ€‹เบ›เบฑเบ”โ€‹เบˆเบธโ€‹เบšเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบญเบฐโ€‹เบ™เบฒโ€‹เบ„เบปเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™. เบกเปˆเบงเบ™เบเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™!

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบšเบฑเบ™เบˆเบธ?

เบšเปเบฅเบดเบชเบฑเบ”เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบ”เบปเบ™เบ•เบตเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต Hashicorp Nomad เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ - Consul เปเบฅเบฐ Vault. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบšเบฑเบ™เบˆเบธเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบเป€เบ›เบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบกเบต docker hosts เบเบฑเบš Windows Server Core OS เบฎเบธเปˆเบ™ 1803 เปเบฅเบฐ 1809, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบชเบฐเบšเบฑเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš docker เบชเปเบฒเบฅเบฑเบš 1803 เปเบฅเบฐ 1809. เปƒเบ™เบฎเบธเปˆเบ™ 1803, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบˆเบทเปˆเบˆเปเบฒเบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡ host docker เบเปเปˆเบชเป‰เบฒเบ‡. เบ•เป‰เบญเบ‡เบเบปเบ‡เบเบฑเบšเบ•เบปเบงเป€เบฅเบเบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš docker เบžเบทเป‰เบ™เบ–เบฒเบ™ เปเบฅเบฐเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเบšเบฑเบ™เบˆเบธเบˆเบฒเบเบฎเบนเบšเบžเบฒเบšเบ™เบตเป‰เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง. เบฎเบธเปˆเบ™ 1809 เบšเปเปˆเบกเบตเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบ—เบตเปˆเบ™เบตเป‰.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™?

เบงเบดเบชเบฐเบงเบฐเบเบญเบ™เบ—เบตเบกเบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเบกเบต เบซเบผเบทเบˆเบณเบเบฑเบ”เบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เป‚เบฎเบช; เบšเปเปˆเบกเบตเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบŠเบธเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเปˆเบ™เปƒเบ™เป‚เบฎเบชเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เป„เบง, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ”เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบซเบผเบทเบงเบฝเบเบชเบณเบฅเบฑเบš Visual Studio. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker. เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบžเบฝเบ‡เปเบ•เปˆ dockerfile เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบ™เบตเป‰.

เบˆเบฒเบเบ—เบดเบ”เบชเบฐเบ”เบตเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”

เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš Docker เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบกเปˆเบ™เป„เบ”เป‰เบ–เบทเบเบเบฐเบเบฝเบกเปƒเบ™ Dockerfile script เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป€เบญเบ‡. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก, เบ„เบท, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบš docker เบเบฑเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” docker cache เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เบ—เบธเบ dependencies.

เบ‚เปเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡ dockerfile script เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบ™เบตเป‰.

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเบ‚เบญเบ‡เบฎเบธเปˆเบ™ OS เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เปƒเบ™ dockerfile เป‚เบ”เบเบœเปˆเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบฎเบธเปˆเบ™เบ—เบตเปˆเบ–เบทเบเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡, เปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เปเบ—เบฑเบเบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบžเบทเป‰เบ™เบ–เบฒเบ™.

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป€เบ•เบฑเบกเบ‚เบญเบ‡เปเบ—เบฑเบเบฎเบนเบšเบžเบฒเบš Microsoft Windows Server เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

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

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ RUN เบžเบฒเบเปƒเบ™ dockerfile เปƒเบ™ Windows OS เบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™ console cmd.exe. เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบชเบฐเบ„เบฃเบดเบšเปเบฅเบฐเบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเปƒเบŠเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเปเบฒเบ™เบปเบ”เบ„เบทเบ™เปƒเบซเบกเปˆ console execution เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™ 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'

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป‚เบ”เบเปƒเบŠเป‰เบŠเบฑเบญเบเป‚เบเปเบฅเบฑเบ”, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบžเบงเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, เบซเบผเบทเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เป€เบ—เบทเปˆเบญเบฅเบฐเบญเบฑเบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบœเปˆเบฒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเบธเบ”. เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เป„เบŸเบฅเปŒ manifest เปƒเบ™เบฎเบนเบšเปเบšเบš 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
  • เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบท 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 เปเบฅเปˆเบ™เบชเบฐเบ„เบฃเบดเบšเบ•เบดเบ”เบ•เบฑเป‰เบ‡, เปเบฅเบฐเป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบชเบฐเบšเบฒเบ, เป€เบžเบตเปˆเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบชเบนเปˆเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบเบฑเบšเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก. 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 ++ เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบก, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡ docker เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ.

เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบขเบนเปˆเป€เบ—เบดเบ‡เป€เบฎเบทเบญเป€เบ›เบฑเบ™เบฎเบนเบšเบžเบฒเบšเบเปเปˆเบชเป‰เบฒเบ‡. เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบฐเบ„เบดเบš 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 ++ เบžเบฒเบเปƒเบ™ container เบžเบฒเบเปƒเบ•เป‰ Windows เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ docker multi-stage builds เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบฎเบนเบšเบžเบฒเบšเป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™