αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ docker multi-stage αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– windows

αžŸαž½αžŸαŸ’αžαžΈβ€‹αž’αŸ’αž“αž€β€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆ! αžαŸ’αž‰αž»αŸ†αžˆαŸ’αž˜αŸ„αŸ‡ Andrey αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαžœαž·αžŸαŸ’αžœαž€αžš DevOps αž“αŸ… Exness αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ” αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊαž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž€αžŸαžΆαž„ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αž‚αžΆαŸ†αž‘αŸ’αžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ docker αž€αŸ’αžšαŸ„αž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž›αžΈαž“αž»αž… (αž αŸ…αž€αžΆαžαŸ‹αžαžΆ OS)αŸ” αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚ OS αž‚αŸ„αž›αžŠαŸ…αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž‚αžΊ Windows Server αž“αž·αž„αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„ C++ αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ† αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αž·αžαžŸαŸ’αž“αž·αž‘αŸ’αž’αž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž‡αžΆαž˜αž½αž™ docker containers αž“αŸ…αž€αŸ’αžšαŸ„αž˜ Windows OS αž αžΎαž™αž‡αžΆαž‘αžΌαž‘αŸ…αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ C++ αŸ” αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž˜αž½αž™ αž αžΎαž™αž”αžΆαž“αžŸαž·αž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‘αž»αž€αž€αŸ’αž“αž»αž„ Windows αŸ”

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ docker multi-stage αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– windows

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαž€αžΆαžšαž›αŸ†αž”αžΆαž€αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžˆαž˜αž˜αž»αž αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž–αž½αž€αž‚αŸαŸ” αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαžœαžΆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž αžΆαž”αŸ’αžšαžˆαž˜αž“αžΆαž–αŸαž›αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž’αž“αžΆαž‚αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžŸαžΌαž˜αžšαžΈαž€αžšαžΆαž™αž’αžΆαž“!

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž’αž»αž„?

αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αž˜αžΆαž“αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžαž“αŸ’αžšαŸ’αžαžΈαž€αž»αž„αžαžΊαž“αŸαžš Hashicorp Nomad αž“αž·αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’ - αž€αž»αž„αžŸαŸŠαž»αž› αž“αž·αž„αžαž»αžŠαŸαž€αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž€αž»αž„αžαžΊαž“αŸαžšβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸβ€‹αž‡αžΆβ€‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšβ€‹αž”αž„αŸ’αžšαž½αž”αž”αž„αŸ’αžšαž½αž˜β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž•αŸ’αžαž›αŸ‹β€‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž–αŸαž‰αž›αŸαž‰αŸ” αžŠαŸ„αž™αžŸαžΆαžšαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž˜αžΆαž“ docker hosts αž‡αžΆαž˜αž½αž™ Windows Server Core OS αž€αŸ†αžŽαŸ‚ 1803 αž“αž·αž„ 1809 αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαŸ‚αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž“αŸƒαžšαžΌαž”αž—αžΆαž– docker αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 1803 αž“αž·αž„ 1809αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚ 1803 αžœαžΆαž‡αžΆαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αžαžΆαž›αŸαžαž€αŸ‚αž”αŸ’αžšαŸ‚αž“αŸƒ build docker host αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αž›αŸαžαž€αŸ‚αž”αŸ’αžšαŸ‚αž“αŸƒαžšαžΌαž”αž—αžΆαž– docker αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αž€αž»αž„αžαžΊαž“αŸαžšαž–αžΈαžšαžΌαž”αž—αžΆαž–αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž€αŸ†αžŽαŸ‚ 1809 αž˜αž·αž“αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž”αŸ‚αž”αž“αŸαŸ‡αž‘αŸαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›?

αžœαž·αžŸαŸ’αžœαž€αžšαž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž˜αž·αž“αž˜αžΆαž“ αž¬αž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαžαŸ’αž›αžΆαŸ†αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αŸ αžœαžΆαž˜αž·αž“αž˜αžΆαž“αžœαž·αž’αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαžŸαž˜αžΆαžŸαž’αžΆαžαž»αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž”αžΆαž“αž†αžΆαž”αŸ‹αžšαž αŸαžŸαž‘αŸ αž§αž‘αžΆαž αžšαžŽαŸ αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαž”αž“αŸ’αžαŸ‚αž˜ αž¬αž”αž“αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Visual Studio αž‡αžΆαžŠαžΎαž˜αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŠαŸ†αž‘αžΎαž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„ build Docker imageαŸ” αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ‚αž―αž€αžŸαžΆαžš dockerfile αž αžΎαž™αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ†αž–αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž“αŸαŸ‡αŸ”

αž–αžΈαž‘αŸ’αžšαžΉαžŸαŸ’αžαžΈαž‘αŸ…αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžšαžΌαž”αž—αžΆαž–αž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› Docker αžŠαŸαž›αŸ’αž’ αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” Dockerfile αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αž›αž½αž“αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ αž–αŸ„αž›αž‚αžΊαž‡αŸ†αž αžΆαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– docker αž”αž‹αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš docker cache αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ†αž‘αžΎαž„αž“αŸƒαžšαžΆαž›αŸ‹αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž” dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž“αŸαŸ‡αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž“αŸƒαž€αŸ†αžŽαŸ‚ OS αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ dockerfile αžŠαŸ‚αž›αž›αŸαžαž€αŸ†αžŽαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αž„αŸ’αž€αžΎαž αž αžΎαž™αžœαžΆαž€αŸαž‡αžΆαžŸαŸ’αž›αžΆαž€αž“αŸƒαžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž•αž„αžŠαŸ‚αžšαŸ”

αž”αž‰αŸ’αž‡αžΈαž–αŸαž‰αž›αŸαž‰αž“αŸƒαžŸαŸ’αž›αžΆαž€αžšαžΌαž”αž—αžΆαž–αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Microsoft Windows αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

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

αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† RUN αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ dockerfile αž“αŸ…αž›αžΎ Windows OS αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžŸαžΌαž› 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'

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαžΌαž€αžΌαž‘αžΆ αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αžΆαž…αž αž»αž…αž–αž½αž€αžœαžΆαž‡αžΆαž”αž‰αŸ’αž‡αžΈαž˜αž½αž™ αž¬αžŠαŸ†αž‘αžΎαž„αžœαžΆαž˜αŸ’αžαž„αž˜αž½αž™αŸ— αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž“αžΈαž˜αž½αž™αŸ—αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž”αžΆαž“αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžš 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 ++ αžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αžΆαžŸαž’αžΆαžαž»αž”αž“αŸ’αžαŸ‚αž˜αžŠαžΌαž…αž‡αžΆαŸ–

  • αž§αž”αž€αžšαžŽαŸαž•αŸ’αž‘αž»αž€αž€αžΆαžšαž„αžΆαžš 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"
  ]
}

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 multi-stage build αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž…αŸ’αžšαžΎαž“αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž™αž“αŸ’αžαž αŸ„αŸ‡αž‡αžΆαžšαžΌαž”αž—αžΆαž–αžŸαžΆαž„αžŸαž„αŸ‹ αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” 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 container αž“αž·αž„αžšαž”αŸ€αž”αž”αŸ’αžšαžΎαžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸƒ docker multi-stage builds αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž–αŸαž‰αž›αŸαž‰αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹