αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αž˜αž»αž“αž–αŸαž›αžŠαŸ‚αž›αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž˜αž½αž™αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αž›αž·αž αž€αŸ’αž“αž»αž„αžαŸ’αž„αŸƒαž“αŸƒαž€αŸ’αžšαž»αž˜αž’αŸ’αž“αž€αžŸαŸ†αžŠαŸ‚αž„αžŠαŸαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž“αž·αž„ CI/CD αž˜αžΆαž“αž•αŸ’αž›αžΌαžœαžŠαŸαžœαŸ‚αž„αž†αŸ’αž„αžΆαž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαž–αžΈαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž“αž·αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αŸ” αž–αžΈαž˜αž»αž“αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‘αž»αž€αž―αž€αžŸαžΆαžšαžαŸ’αž˜αžΈαžαžΆαž˜αžšαž™αŸˆ FTP (αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αŸ’αžœαžΎαžœαžΆαž‘αŸ€αžαž‘αŸαž˜αŸ‚αž“αž‘αŸ?) αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš "αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™" αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžœαž·αž“αžΆαž‘αžΈαŸ” αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžŸαŸ†αžŽαžΎβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‚αŸ’αž“αžΆ αž αžΎαž™β€‹αžšαž„αŸ‹αž…αžΆαŸ†β€‹αžšαž™αŸˆαž–αŸαž›β€‹αž™αžΌαžšβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž˜αž»αžαž„αžΆαžšβ€‹αž“αŸαŸ‡β€‹αž’αžΆαž…β€‹αžˆαžΆαž“β€‹αžŠαž›αŸ‹β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎαŸ”

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

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αž™αžΎαž„αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž‚αžΆαŸ†αž‘αŸ’αžšαž‚αŸαž αž‘αŸ†αž–αŸαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™αŸ– Tass, αž€αžŽαŸ’αžαžΉαž„, "αž€αžΆαžŸαŸ‚αžαžαŸ’αž˜αžΈ", αžŸαžΆαž’αžΆαžšαžŽαžšαžŠαŸ’αž‹β€¦ αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“ αž™αžΎαž„αž”αžΆαž“αž–αž„αŸ’αžšαžΈαž€αž•αž›αž”αŸαžαŸ’αžšαžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ„αž™αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αž›αž·αžαž•αž› αž€αžΆαžšβ€‹αžšαŸ†αž›αžΉαž€. αž αžΎαž™αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ αž αžΎαž™αž€αŸ†αž αž»αžŸαž…αžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αžŸαž‡αž»αž› αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž™αžΊαžαž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž”αž‰αŸ’αž αžΆαž’αŸ†αŸ”

αž™αžΎαž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ… GitLab αŸ” αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αžšαžΌαž”αž—αžΆαž– αžšαž»αž‰αž–αž½αž€αžœαžΆαž‘αŸ… GitLab Registry αž αžΎαž™αžšαž˜αŸ€αž›αžœαžΆαž…αŸαž‰αž‘αŸ…αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ” αžšαžΏαž„αžœαŸ‚αž„αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžšαžΌαž”αž—αžΆαž–αŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸ– αžŠαŸ„αž™β€‹αž‚αŸ’αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαž“β€‹αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž•αŸ’αž“αŸ‚αž€β€‹αžαžΆαž„αž€αŸ’αžšαŸ„αž™β€‹αž“αžΈαž˜αž½αž™αŸ—β€‹αž”αžΆαž“β€‹αž…αŸ†αžŽαžΆαž™β€‹αž–αŸαž› 14 αž“αžΆαž‘αžΈαŸ”

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

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

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž‡αžΆαž”αŸ‹αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž”αžšαž·αžŸαŸ’αžαžΆαž“αžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαŸ†αž›αžΉαž€ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Angular αž‘αž‘αŸαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

ng n app

αž”αž“αŸ’αžαŸ‚αž˜ PWA αž‘αŸ…αžœαžΆ (αž™αžΎαž„αžšαžΈαž€αž…αž˜αŸ’αžšαžΎαž“)αŸ–

ng add @angular/pwa --project app

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

FROM node:12.16.2
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

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

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

  1. αž™αžΎαž„αž›αž»αž”αžšαžΌαž”αž—αžΆαž–αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈαž˜αž»αž“αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αŸ”
    docker rmi $(docker images -q)
  2. αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αŸ”
    time docker build -t app .
  3. αž™αžΎαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž―αž€αžŸαžΆαžš src/index.html - αž™αžΎαž„αž’αŸ’αžœαžΎαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”
  4. αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž‡αžΆαž›αžΎαž€αž‘αžΈαž–αžΈαžšαŸ”
    time docker build -t app .

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΌαž”αž—αžΆαž–αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ (αž”αž“αŸ’αžαŸ‚αž˜αž›αžΎαžœαžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜) αž“αŸ„αŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ Docker αž“αžΉαž„αž˜αžΆαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž›αžΎαž™αž“αŸ’αžαž αŸ„αŸ‡αžšαž½αž…αž αžΎαž™αŸ” αž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΏαž“αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ” αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž€αžΎαžαž‘αžΎαž„αžαŸ‚αž˜αŸ’αžαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡β€”αž‡αžΆαž›αžΎαž€αž‘αžΈαž˜αž½αž™β€”αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž™αžΎαž„αž’αžΆαž…αž˜αž·αž“αž’αžΎαž–αžΎαžαžΆαžαžΎαž–αŸαž›αžŠαŸ†αž”αžΌαž„αž“αŸ„αŸ‡αž™αžΊαžαž”αŸ‰αž»αžŽαŸ’αžŽαžΆαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΈαž–αžΈαžšαž“αŸƒαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŠαŸ…αž‘αžΎαž„ αž αžΎαž™αž™αžΎαž„αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžšαž½αž…αžšαžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαž»αžαž“αŸ†αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αž€αŸαž“αžΉαž„αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ†αž”αžΌαž„αž•αž„αžŠαŸ‚αžšαŸ”

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

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Status: Downloaded newer image for node:12.16.2
Step 2/5 : WORKDIR /app
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Time: 37581ms
Successfully built c8c279335f46
Successfully tagged app:latest

real 5m4.541s
user 0m0.000s
sys 0m0.000s

αž™αžΎαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αžΆαžαž·αž€αžΆαž“αŸƒ src/index.html αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž‡αžΆαž›αžΎαž€αž‘αžΈαž–αžΈαžšαŸ”

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Time: 37902ms
Successfully built 79f335df92d3
Successfully tagged app:latest

real 3m33.262s
user 0m0.000s
sys 0m0.000s

αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαž™αžΎαž„αž˜αžΆαž“αžšαžΌαž”αž—αžΆαž–αž¬αž’αžαŸ‹ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker images:

REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
app          latest   79f335df92d3   About a minute ago   1.74GB

αž˜αž»αž“αž–αŸαž›αž”αž„αŸ’αž€αžΎαž Docker αž™αž€αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αžŠαŸαž˜αž·αž“αžšαž”αžŸαŸ‹αžœαžΆαŸ” Sending build context to Docker daemon 409MB. αž”αžšαž·αž”αž‘αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž…αŸ†αž–αŸ„αŸ‡αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαžΆαž„αžŸαž„αŸ‹αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžαžαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ - ".", - αž αžΎαž™ Docker αž’αžΌαžŸαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž™αžΎαž„αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž“αŸαŸ‡αŸ” 409 MB αž‚αžΊαž…αŸ’αžšαžΎαž“αŸ– αžαŸ„αŸ‡αž‚αž·αžαž–αžΈαžšαž”αŸ€αž”αž‡αž½αžŸαž‡αž»αž›αžœαžΆαŸ”

αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž”αžšαž·αž”αž‘

αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž”αžšαž·αž”αž‘ αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžšαŸ” αž¬αžŠαžΆαž€αŸ‹αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™ αž αžΎαž™αž…αž„αŸ’αž’αž»αž›αž”αžšαž·αž”αž‘ docker αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž“αŸαŸ‡αŸ” αž“αŸαŸ‡αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αžαŸ‚αž„αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αŸ– αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αž‚αž½αžšαž’αžΌαžŸαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŠαžΆαž€αŸ‹αž―αž€αžŸαžΆαžš .dockerignore αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„ αž αžΎαž™αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αŸ–

.git
/node_modules

αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž˜αŸ’αžαž„αž‘αŸ€αžαŸ–

$ time docker build -t app .
Sending build context to Docker daemon 607.2kB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Time: 37313ms
Successfully built 4942f010792a
Successfully tagged app:latest

real 1m47.763s
user 0m0.000s
sys 0m0.000s

607.2 KB αž‚αžΊαž›αŸ’αž’αž‡αžΆαž„ 409 MB αŸ” αž™αžΎαž„αž€αŸαž”αžΆαž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αž–αžΈ 1.74 αž‘αŸ… 1.38 GBαŸ–

REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
app          latest   4942f010792a   3 minutes ago   1.38GB

αžαŸ„αŸ‡αž–αŸ’αž™αžΆαž™αžΆαž˜αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ”

αž™αžΎαž„αž”αŸ’αžšαžΎαž’αžΆαž›αŸ‹αž•αŸ‚αž“

αžœαž·αž’αžΈαž˜αž½αž™αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αž‚αžΊαžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αž˜αŸαžαžΌαž…αž˜αž½αž™αŸ” αžšαžΌαž”αž—αžΆαž–αž˜αžΆαžαžΆαž”αž·αžαžΆαž‚αžΊαž‡αžΆαžšαžΌαž”αž—αžΆαž–αž“αŸ…αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αŸ” αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ FROM αž“αŸ…αž€αŸ’αž“αž»αž„ Dockerfile αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ Ubuntu αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ nodejs αžšαž½αž…αž αžΎαž™αŸ” αž αžΎαž™αžœαžΆαž˜αžΆαž“αž‘αž˜αŸ’αž„αž“αŸ‹ ...

$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB

... αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž˜αž½αž™αž‡αžΈαž αŸ’αž‚αžΆαž”αŸƒαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αž˜αŸ’αžšαž·αžαžŸαŸ†αž‘αŸαž„αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ Alpine Linux αŸ” Alpine αž‚αžΊαž‡αžΆαž›αžΈαž“αž»αž…αžαžΌαž…αžŽαžΆαžŸαŸ‹αŸ” αžšαžΌαž”αž—αžΆαž– docker αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ nodejs αž•αŸ’αž’αŸ‚αž€αž›αžΎαž’αžΆαž›αŸ‹αž•αŸ‚αž“αž˜αžΆαž“αž‘αž˜αŸ’αž„αž“αŸ‹αžαŸ’αžšαžΉαž˜αžαŸ‚ 88.5 MB αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αž‡αŸ†αž“αž½αžŸαžšαžΌαž”αž—αžΆαž–αžŠαŸαžšαžŸαŸ‹αžšαžœαžΎαž€αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αŸ–

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αžŠαŸ†αž‘αžΎαž„β€‹αžšαž”αžŸαŸ‹β€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“β€‹αžŠαŸ‚αž›β€‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž”αžΆαž‘ Angular αž˜αž·αž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“ Python Β―(Β°_o)/Β― αž‘αŸαŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αž”αžΆαž“αž’αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡αžŠαž›αŸ‹ 150 MBαŸ–

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   aa031edc315a   22 minutes ago   761MB

αž…αžΌαžšαž™αžΎαž„αž‘αŸ…αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ”

αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›

αž˜αž·αž“αž˜αŸ‚αž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αž“αŸ„αŸ‡αž‘αŸαŸ”

$ docker run app ls -lah
total 576K
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 .
drwxr-xr-x 1 root root 4.0K Apr 16 20:00 ..
-rwxr-xr-x 1 root root 19 Apr 17 2020 .dockerignore
-rwxr-xr-x 1 root root 246 Apr 17 2020 .editorconfig
-rwxr-xr-x 1 root root 631 Apr 17 2020 .gitignore
-rwxr-xr-x 1 root root 181 Apr 17 2020 Dockerfile
-rwxr-xr-x 1 root root 1020 Apr 17 2020 README.md
-rwxr-xr-x 1 root root 3.6K Apr 17 2020 angular.json
-rwxr-xr-x 1 root root 429 Apr 17 2020 browserslist
drwxr-xr-x 3 root root 4.0K Apr 16 19:54 dist
drwxr-xr-x 3 root root 4.0K Apr 17 2020 e2e
-rwxr-xr-x 1 root root 1015 Apr 17 2020 karma.conf.js
-rwxr-xr-x 1 root root 620 Apr 17 2020 ngsw-config.json
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 node_modules
-rwxr-xr-x 1 root root 494.9K Apr 17 2020 package-lock.json
-rwxr-xr-x 1 root root 1.3K Apr 17 2020 package.json
drwxr-xr-x 5 root root 4.0K Apr 17 2020 src
-rwxr-xr-x 1 root root 210 Apr 17 2020 tsconfig.app.json
-rwxr-xr-x 1 root root 489 Apr 17 2020 tsconfig.json
-rwxr-xr-x 1 root root 270 Apr 17 2020 tsconfig.spec.json
-rwxr-xr-x 1 root root 1.9K Apr 17 2020 tslint.json

αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αž–αžΈ docker run app ls -lah αž™αžΎαž„αž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” app αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ” ls -lahαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž€αž»αž„αžαžΊαž“αŸαžšαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αžαŸ’αž›αž½αž“αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αž›αž·αžαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ‚αžαžαž˜αž½αž™αŸ” dist. αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž―αž€αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž›αžΎ nodejs αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” αž‘αžΆαž™αž–αžΆαž€αŸ’αž™αžšαž»αžŸαŸ’αžŸαŸŠαžΈαžŠαŸ‚αž›αž˜αžΆαž“αž’αž€αŸ’αžŸαžš "y" αž…αŸ†αž“αž½αž“αž”αž½αž“αŸ” αžαŸ’αžšαžΌαžœαž αžΎαž™! Ynzhynyksy αŸ” αžαŸ„αŸ‡αžαžαžšαžΌαž”αž‡αžΆαž˜αž½αž™ nginx αžŠαžΆαž€αŸ‹ folder αž…αžΌαž› dist αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαžΌαž…αž˜αž½αž™αŸ–

server {
    listen 80 default_server;
    server_name localhost;
    charset utf-8;
    root /app/dist;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αžΉαž„αž‡αž½αž™αž™αžΎαž„αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αŸ” αžαŸ„αŸ‡αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš Dockerfile αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

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

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   2c6c5da07802   29 minutes ago   36MB

αžαŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαž‡αžΆαž˜αž½αž™αžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

docker run -p8080:80 app

αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‡αž˜αŸ’αžšαžΎαžŸ -p8080:80 αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž…αŸ’αžšαž€ 8080 αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αž€αžΆαž“αŸ‹αž…αŸ’αžšαž€ 80 αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž› nginx αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž”αžΎαž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€ http://localhost:8080/ αž αžΎαž™αž™αžΎαž„αžƒαžΎαž‰αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž αžΎαž™!

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αž€αžΆαžšαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αž–αžΈ 1.74 GB αžŠαž›αŸ‹ 36 MB αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ…αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαžΌαž˜αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž–αŸαž›αžœαŸαž›αžΆαž“αŸƒαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαŸ”

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/11 : FROM node:12.16.2-alpine3.11 as builder
Step 2/11 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/11 : WORKDIR /app
 ---> Using cache
Step 4/11 : COPY . .
Step 5/11 : RUN npm ci
added 1357 packages in 47.338s
Step 6/11 : RUN npm run build --prod
Date: 2020-04-16T21:16:03.899Z - Hash: fffa0fddaa3425c55dd3 - Time: 39948ms
 ---> 27f1479221e4
Step 7/11 : FROM nginx:stable-alpine
Step 8/11 : WORKDIR /app
 ---> Using cache
Step 9/11 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 10/11 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 11/11 : COPY --from=builder /app/dist/app .
Successfully built d201471c91ad
Successfully tagged app:latest

real 2m17.700s
user 0m0.000s
sys 0m0.000s

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαŸ’αžšαž‘αžΆαž”αŸ‹

αž‡αŸ†αž αžΆαž“αž”αžΈαžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ (αž‡αŸ†αž“αž½αž™ Using cache) αž“αŸ…αž‡αŸ†αž αžΆαž“αž‘αžΈαž”αž½αž“ αž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„ αž αžΎαž™αž“αŸ…αž‡αŸ†αž αžΆαž“αž‘αžΈαž”αŸ’αžšαžΆαŸ† αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ RUN npm ci - αž…αŸ’αžšαžΎαž“αžŠαžΌαž…αž‡αžΆ 47.338s αŸ” αž αŸαžαž»αž’αŸ’αžœαžΈβ€‹αž”αžΆαž“β€‹αžŠαŸ†αž‘αžΎαž„β€‹αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž‘αžΎαž„αžœαž·αž‰β€‹αžšαžΆαž›αŸ‹αž–αŸαž› αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž–αž½αž€αž‚αŸβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšβ€‹αž€αž˜αŸ’αžšβ€‹αžŽαžΆαžŸαŸ‹? αž…αžΌαžšαž™αžΎαž„αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž–αž½αž€αž‚αŸαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ” αž…αŸ†αž“αž»αž…αž“αŸ„αŸ‡αž‚αžΊαžαžΆ Docker αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžŠαŸ„αž™αžŸαŸ’αžšαž‘αžΆαž”αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αžœαžΆαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž¬αž’αžαŸ‹αŸ” αž“αŸ…αž‡αŸ†αž αžΆαž“αž‘αžΈ XNUMX αž™αžΎαž„αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž αžΎαž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸ αž–αž·αžαžŽαžΆαžŸαŸ‹αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡ Docker αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž˜αž·αž“αž™αž€αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž“αŸαŸ‡αž…αŸαž‰αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαž˜αžΆαž“αž―αž€αžŸαžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž•αž„αžŠαŸ‚αžš! αžαŸ„αŸ‡αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αž“αŸ’αžαž·αž…αž”αž“αŸ’αžαž½αž…αž…αŸ†αž–αŸ„αŸ‡ Dockerfile αŸ”

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

αžŠαŸ†αž”αžΌαž„ package.json αž“αž·αž„ package-lock.json αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αŸ” αž‡αžΆβ€‹αž›αž‘αŸ’αž’αž•αž›:

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/12 : FROM node:12.16.2-alpine3.11 as builder
Step 2/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/12 : WORKDIR /app
 ---> Using cache
Step 4/12 : COPY package*.json ./
 ---> Using cache
Step 5/12 : RUN npm ci
 ---> Using cache
Step 6/12 : COPY . .
Step 7/12 : RUN npm run build --prod
Date: 2020-04-16T21:29:44.770Z - Hash: fffa0fddaa3425c55dd3 - Time: 38287ms
 ---> 1b9448c73558
Step 8/12 : FROM nginx:stable-alpine
Step 9/12 : WORKDIR /app
 ---> Using cache
Step 10/12 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 11/12 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 12/12 : COPY --from=builder /app/dist/app .
Successfully built a44dd7c217c3
Successfully tagged app:latest

real 0m46.497s
user 0m0.000s
sys 0m0.000s

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

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž–αžΆαž€αŸ’αž™αž–αžΈαžšαž”αžΈαž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžšαžΌαž”αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ CI/CDαŸ”

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΌαž”αž—αžΆαž–αž–αžΈαž˜αž»αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹

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

αž…αžΌαžšαž™αžΎαž„αž™αž€αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαž€αžŸαžΆαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ GitHub Actions αŸ” αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸαŸ‡αŸ”

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Build
      run: |
        docker build 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

αžšαžΌαž”αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† αž“αž·αž„αžšαž»αž‰αž‘αŸ…αž€αž‰αŸ’αž…αž”αŸ‹ GitHub αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž–αžΈαžšαž“αžΆαž‘αžΈ αž“αž·αž„ 20 αžœαž·αž“αžΆαž‘αžΈαŸ–

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž”αŸ’αžαžΌαžšβ€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹ αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž±αŸ’αž™β€‹αžƒαŸ’αž›αžΆαŸ†αž„β€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαŸ„αž™β€‹αž•αŸ’αž’αŸ‚αž€β€‹αž›αžΎβ€‹αžšαžΌαž”αž—αžΆαž–β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž˜αž»αž“β€‹αŸ—αŸ–

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Pull latest images
      run: |
        docker pull $IMAGE_NAME:latest || true
        docker pull $IMAGE_NAME-builder-stage:latest || true

    - name: Images list
      run: |
        docker images

    - name: Build
      run: |
        docker build 
          --target builder 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          -t $IMAGE_NAME-builder-stage 
          .
        docker build 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          --cache-from $IMAGE_NAME:latest 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME-builder-stage:latest
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ build. αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžšαžΌαž”αž—αžΆαž–αž›αž‘αŸ’αž’αž•αž›αž“αžΉαž„αž‡αžΆαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž–αžΈαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž˜αž»αž“αž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž‘αŸαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž–αžΈαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž˜αž»αž“ Docker αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž„αžŸαž„αŸ‹αžšαžΌαž”αž—αžΆαž–αž‡αžΆαž˜αž½αž™ nodejs (αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαžΆαž„αžŸαž„αŸ‹) αž”αžΆαž“αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αžšαžΌαž”αž—αžΆαž–αž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ $IMAGE_NAME-builder-stage αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αž‰αž‘αŸ…αž€αž‰αŸ’αž…αž”αŸ‹ GitHub αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‡αžΆαž”αŸ’αžšαž—αž–αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ”

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

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

αž€αžΆαžšαžαžαž‘αž»αž€αž‡αžΆαž˜αž»αž“

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

αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– nodejs αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Angular αŸ” αž”αž„αŸ’αž€αžΎαž Dockerfile.node αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++

αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž› αž“αž·αž„αž‡αŸ†αžšαž»αž‰αžšαžΌαž”αž—αžΆαž–αžŸαžΆαž’αžΆαžšαžŽαŸˆαž“αŸ…αž€αŸ’αž“αž»αž„ Docker HubαŸ–

docker build -t exsmund/node-for-angular -f Dockerfile.node .
docker push exsmund/node-for-angular:latest

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ Dockerfile αž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ–

FROM exsmund/node-for-angular:latest as builder
...

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

αž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ’αž›αŸ‡αŸ—αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– Docker αŸ” αž§αž‘αžΆαž αžšαžŽαŸαžšαž αžΌαžαžŠαž›αŸ‹ 30 αžœαž·αž“αžΆαž‘αžΈ

αž™αžΎαž„αž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– docker αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž±αŸ’αž™αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΏαž“ αžŸαžΌαž˜αžŸαžΆαž€αž›αŸ’αž”αž„αž”αŸ’αžšαžΎαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ–

  • αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž”αžšαž·αž”αž‘;
  • αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΌαž”αž—αžΆαž–αž˜αŸαžαžΌαž…;
  • αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž–αž αž»αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›;
  • αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸ…αž€αŸ’αž“αž»αž„ Dockerfile αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ”
  • αžŠαŸ†αž‘αžΎαž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ CI/CD;
  • αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž”αž‹αž˜αŸ”

αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž§αž‘αžΆαž αžšαžŽαŸαž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž› Docker αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™αž’αŸ’αž“αž€αž“αžΉαž„αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž›αŸ’αž’αž”αŸ†αž•αž»αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž›αŸαž„αž‡αžΆαž˜αž½αž™αž§αž‘αžΆαž αžšαžŽαŸαž–αžΈαž’αžαŸ’αžαž”αž‘ αžƒαŸ’αž›αžΆαŸ†αž„αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ https://github.com/devopsprodigy/test-docker-build.

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

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