แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒฉแƒ”แƒ•แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒฉแƒฅแƒแƒ แƒแƒ— Docker แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 30 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”

แƒกแƒแƒœแƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒจแƒ”แƒ•แƒ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜, แƒ แƒ—แƒฃแƒšแƒ˜ แƒแƒ แƒ™แƒ”แƒกแƒขแƒ แƒแƒœแƒขแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ CI/CD-แƒ˜แƒก แƒ“แƒฆแƒ”แƒ”แƒ‘แƒจแƒ˜, แƒ“แƒ˜แƒ“แƒ˜ แƒ’แƒ–แƒแƒ แƒ’แƒแƒกแƒแƒ•แƒšแƒ”แƒšแƒ˜ แƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒแƒ›แƒ“แƒ” แƒ“แƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒแƒ›แƒ“แƒ”. แƒแƒ“แƒ แƒ”, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ”แƒซแƒšแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ FTP-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— (แƒแƒ›แƒแƒก แƒแƒฆแƒแƒ แƒแƒ•แƒ˜แƒœ แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก, แƒแƒ แƒ?) แƒ“แƒ "แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก" แƒžแƒ แƒแƒชแƒ”แƒกแƒก แƒฌแƒแƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ. แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ“แƒ แƒ“แƒ˜แƒ“แƒฎแƒแƒœแƒก แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒแƒ›แƒ“แƒ” แƒ›แƒ˜แƒกแƒ•แƒšแƒแƒก.

แƒแƒ› แƒ’แƒ–แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒ Docker แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ. แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ แƒฎแƒแƒœ แƒฌแƒฃแƒ—แƒ”แƒ‘แƒก แƒ’แƒ แƒซแƒ”แƒšแƒ“แƒ”แƒ‘แƒ, แƒฎแƒแƒœ แƒแƒ—แƒ”แƒฃแƒš แƒฌแƒฃแƒ—แƒก, แƒ แƒแƒกแƒแƒช แƒซแƒœแƒ”แƒšแƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ•แƒฃแƒฌแƒแƒ“แƒแƒ— แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ• แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒ•แƒคแƒฃแƒ—แƒแƒ•แƒ— แƒกแƒฃแƒ แƒแƒ—แƒจแƒ˜, แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฉแƒฅแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒแƒ› แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒœแƒ˜แƒฃแƒแƒœแƒกแƒ”แƒ‘แƒก.

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒฉแƒ”แƒ•แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒฉแƒฅแƒแƒ แƒแƒ— Docker แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 30 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ™แƒแƒ แƒ’แƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒ แƒ›แƒ”แƒ“แƒ˜แƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒกแƒแƒฅแƒ›แƒ”แƒจแƒ˜: TASS, Bell, "แƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ–แƒ”แƒ—แƒ˜", แƒ แƒ”แƒกแƒžแƒฃแƒ‘แƒšแƒ˜แƒ™แƒโ€ฆ แƒชแƒแƒขแƒ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒแƒ แƒขแƒคแƒ”แƒšแƒ˜ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ. แƒ“แƒ แƒกแƒแƒœแƒแƒ› แƒแƒฎแƒแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒแƒ”แƒ›แƒแƒขแƒ แƒ“แƒ แƒซแƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ“แƒ, แƒœแƒ”แƒšแƒ˜ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ แƒ“แƒ˜แƒ“ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ“ แƒ˜แƒฅแƒชแƒ.

แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ•แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ— GitLab-แƒจแƒ˜. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก, แƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒ— GitLab Registry-แƒจแƒ˜ แƒ“แƒ แƒ•แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ— แƒ›แƒแƒ— แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜. แƒแƒ› แƒกแƒ˜แƒแƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ’แƒ แƒซแƒ”แƒšแƒ˜ แƒ แƒแƒ› แƒแƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒแƒฌแƒงแƒแƒ‘แƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“: แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ backend-แƒ˜แƒก แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒแƒก 14 แƒฌแƒฃแƒ—แƒ˜ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ.

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒฉแƒ”แƒ•แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒฉแƒฅแƒแƒ แƒแƒ— Docker แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 30 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”

แƒ‘แƒแƒšแƒแƒก แƒ’แƒแƒ˜แƒ แƒ™แƒ•แƒ, แƒ แƒแƒ› แƒแƒกแƒ” แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ แƒแƒฆแƒแƒ  แƒจแƒ”แƒ’แƒ•แƒ”แƒซแƒšแƒ แƒ“แƒ แƒ“แƒแƒ•แƒกแƒฎแƒ”แƒ“แƒ˜แƒ— แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒกแƒแƒ แƒ™แƒ•แƒ”แƒ•แƒแƒ“, แƒ—แƒฃ แƒ แƒแƒขแƒแƒ› แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ“แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒซแƒ”แƒšแƒ˜แƒ— แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒก แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ 30 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”!

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒฉแƒ”แƒ•แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒฉแƒฅแƒแƒ แƒแƒ— Docker แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 30 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒแƒ  แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜ Reminder-แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ›แƒแƒกแƒ—แƒแƒœ, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ Angular แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ:

ng n app

แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ›แƒแƒก PWA (แƒฉแƒ•แƒ”แƒœ แƒžแƒ แƒแƒ’แƒ แƒ”แƒกแƒฃแƒšแƒ”แƒ‘แƒ˜ แƒ•แƒแƒ แƒ—):

ng add @angular/pwa --project app

แƒกแƒแƒœแƒแƒ› แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒ˜แƒšแƒ˜แƒแƒœแƒ˜ npm แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ”แƒ แƒ™แƒ•แƒœแƒ”แƒœ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜. Docker แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก แƒ˜แƒ–แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ’แƒแƒ แƒ”แƒ›แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ”แƒฌแƒแƒ“แƒ”แƒ‘แƒ แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜. แƒ˜แƒ–แƒแƒšแƒแƒชแƒ˜แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ—, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜ แƒ”แƒ แƒ— แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”. แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒ›แƒกแƒฃแƒ‘แƒฃแƒฅแƒ˜แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฃแƒจแƒฃแƒแƒšแƒแƒ“ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ–แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ”แƒœ. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒ— แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“, แƒฏแƒ”แƒ  แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒกแƒฃแƒ แƒแƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒจแƒ”แƒ•แƒคแƒฃแƒ—แƒแƒ•แƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก, แƒ แƒแƒช แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“. แƒแƒ แƒกแƒ”แƒ‘แƒ˜แƒ—แƒแƒ“, แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒแƒ แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒฃแƒ แƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒแƒกแƒšแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒ˜แƒฆแƒ”แƒ— Dockerfile:

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

Dockerfile แƒแƒ แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜; แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒ—, Docker แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒคแƒแƒ˜แƒšแƒฃแƒ  แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒคแƒแƒ แƒแƒ•แƒก แƒ›แƒแƒ— แƒฌแƒ˜แƒœแƒแƒ–แƒ”. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒฃแƒœแƒ“แƒ˜ แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒคแƒ”แƒœแƒแƒก. แƒ“แƒ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒแƒ แƒ˜แƒก แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜ แƒ”แƒ แƒ—แƒแƒ“ แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜.

แƒ แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒ˜แƒชแƒแƒ“แƒ”แƒ—: Docker-แƒ˜แƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒคแƒ”แƒœแƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ. แƒ—แƒฃ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒšแƒ แƒ‘แƒแƒšแƒ แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ›แƒแƒจแƒ˜แƒœ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒ“แƒแƒ™แƒ”แƒ แƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ›แƒ–แƒ แƒคแƒ”แƒœแƒแƒก. แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ–แƒ แƒ“แƒ แƒ’แƒแƒœแƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒฅแƒ”แƒจแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒก แƒ’แƒแƒ–แƒแƒ›แƒ•แƒ˜แƒกแƒแƒก แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒ›แƒ˜แƒ•แƒแƒฅแƒชแƒ”แƒ•แƒ— แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ แƒ›แƒ–แƒ แƒฅแƒ”แƒจแƒ˜แƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒแƒก. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ”แƒขแƒแƒžแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“:

  1. แƒฉแƒ•แƒ”แƒœ แƒ•แƒจแƒšแƒ˜แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒแƒ“, แƒ แƒแƒ—แƒ แƒฌแƒ˜แƒœแƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ›แƒ แƒแƒ  แƒ˜แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒแƒก แƒขแƒ”แƒกแƒขแƒ–แƒ”.
    docker rmi $(docker images -q)
  2. แƒฉแƒ•แƒ”แƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก.
    time docker build -t app .
  3. แƒ•แƒชแƒ•แƒšแƒ˜แƒ— src/index.html แƒคแƒแƒ˜แƒšแƒก - แƒ•แƒแƒ‘แƒแƒซแƒแƒ•แƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก.
  4. แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก แƒ›แƒ”แƒแƒ แƒ”แƒ“ แƒ•แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ—.
    time docker build -t app .

แƒ—แƒฃ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ’แƒแƒ แƒ”แƒ›แƒ แƒกแƒฌแƒแƒ แƒแƒ“ แƒแƒ แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ (แƒ“แƒแƒฌแƒ•แƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ— แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฅแƒ•แƒ”แƒ›แƒแƒ—), แƒ›แƒแƒจแƒ˜แƒœ แƒ แƒแƒ“แƒ”แƒกแƒแƒช build แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒ, Docker-แƒก แƒฃแƒ™แƒ•แƒ” แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒฅแƒ”แƒจแƒ˜แƒก แƒ—แƒแƒ˜แƒ’แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒขแƒ–แƒ”. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒแƒ— แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒฅแƒ”แƒจแƒ˜ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ แƒแƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ›แƒแƒฎแƒ“แƒ”แƒก. แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒ•แƒแƒ แƒแƒฃแƒ“แƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒฅแƒ”แƒจแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” build-แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒฎแƒ“แƒ”แƒ‘แƒ - แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒฏแƒ”แƒ แƒ–แƒ”, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ•แƒงแƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒ แƒ”แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ. แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒจแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฅแƒ”แƒจแƒ”แƒ‘แƒ˜ แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒ›แƒ–แƒแƒ“ แƒ•แƒแƒ แƒ— แƒ’แƒแƒ›แƒแƒ•แƒแƒชแƒฎแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒœแƒแƒ›แƒชแƒฎแƒ•แƒแƒ แƒ˜. แƒ—แƒฃแƒ›แƒชแƒ, แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ แƒฉแƒ”แƒ•แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ˜แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒ–แƒ”.

แƒ›แƒแƒ“แƒ˜แƒ— แƒฉแƒแƒ•แƒ“แƒแƒ— แƒ–แƒ”แƒ›แƒแƒ— แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ Dockerfile แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒ“แƒ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— build. แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜ แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒฃแƒšแƒ˜แƒ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

$ 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

แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ›แƒ“แƒ”, แƒ“แƒแƒ™แƒ”แƒ แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜ แƒ“แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒ— แƒ—แƒแƒ•แƒ˜แƒก แƒ“แƒ”แƒ›แƒแƒœแƒจแƒ˜ Sending build context to Docker daemon 409MB. build แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒ แƒแƒ’แƒแƒ แƒช build แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒšแƒ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ˜. แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ - โ€œ.โ€, - แƒ“แƒ Docker แƒ’แƒแƒ“แƒแƒแƒ—แƒ แƒ”แƒ•แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก, แƒ แƒแƒช แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒแƒ› แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜. 409 MB แƒ‘แƒ”แƒ•แƒ แƒ˜แƒ: แƒ›แƒแƒ“แƒ˜ แƒ•แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒ— แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒแƒกแƒฌแƒแƒ แƒแƒ—.

แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ

แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒ แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜. แƒแƒœ แƒ›แƒแƒแƒ—แƒแƒ•แƒกแƒ”แƒ— แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒ˜ แƒชแƒแƒšแƒ™แƒ” แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒแƒ› แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒ–แƒ”. แƒ”แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒ˜แƒงแƒแƒก แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒœแƒแƒ™แƒšแƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ–แƒฃแƒกแƒขแƒ”แƒ‘แƒ: แƒ แƒ แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒฉแƒแƒ—แƒ แƒ”แƒฃแƒšแƒ˜ แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒฉแƒแƒ“แƒ”แƒ— .dockerignore แƒคแƒแƒ˜แƒšแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— แƒ แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ build-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

.git
/node_modules

แƒ“แƒ แƒ™แƒ•แƒšแƒแƒ• แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— build:

$ 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 แƒ’แƒ‘-แƒ›แƒ“แƒ”:

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 แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒžแƒแƒขแƒแƒ แƒ Linux. แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ nodej-แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒšแƒžแƒฃแƒ แƒ–แƒ”, แƒ˜แƒฌแƒแƒœแƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ 88.5 แƒ›แƒ‘. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒแƒชแƒฎแƒแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒกแƒแƒฎแƒšแƒ”แƒ‘แƒจแƒ˜:

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 แƒ›แƒ‘-แƒ›แƒ“แƒ”:

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-แƒ˜แƒ—, แƒฉแƒแƒ•แƒ“แƒแƒ— แƒ›แƒแƒกแƒจแƒ˜ แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” 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-แƒจแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜ แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒก แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒš build-แƒ˜แƒก แƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒก. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒก แƒ“แƒแƒ•แƒฃแƒ แƒ”แƒ™แƒ”แƒ— 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 แƒ’แƒ‘-แƒ“แƒแƒœ 36 แƒ›แƒ‘-แƒ›แƒ“แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒ›แƒ“แƒ” แƒ›แƒ˜แƒขแƒแƒœแƒ˜แƒก แƒ“แƒ แƒแƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒฃแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ— แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก.

$ 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.338 แƒฌแƒ›. แƒ แƒแƒขแƒแƒ› แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ”, แƒ—แƒฃ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ˜แƒจแƒ•แƒ˜แƒแƒ—แƒแƒ“ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ? แƒ›แƒแƒ“แƒ˜ แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ—, แƒ แƒแƒขแƒแƒ› แƒแƒ  แƒ˜แƒฅแƒœแƒ แƒจแƒ”แƒœแƒแƒฎแƒฃแƒšแƒ˜ แƒ˜แƒกแƒ˜แƒœแƒ˜. แƒกแƒแƒฅแƒ›แƒ” แƒ˜แƒ›แƒแƒจแƒ˜แƒ, แƒ แƒแƒ› Docker แƒคแƒ”แƒœแƒ-แƒคแƒ”แƒœแƒแƒ“ แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก, แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒ แƒ—แƒฃ แƒแƒ แƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜. แƒ›แƒ”แƒแƒ—แƒฎแƒ” แƒ”แƒขแƒแƒžแƒ–แƒ” แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒคแƒแƒ˜แƒšแƒก แƒ“แƒ แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒแƒ แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒแƒกแƒ” แƒ แƒแƒ›, 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 Packages-แƒจแƒ˜ แƒแƒ  แƒฌแƒฃแƒ—แƒกแƒ แƒ“แƒ 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. แƒคแƒแƒฅแƒขแƒ˜แƒ, แƒ แƒแƒ› แƒ›แƒ แƒแƒ•แƒแƒšแƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ˜แƒแƒœแƒ˜ แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜ แƒ‘แƒแƒšแƒ แƒ”แƒขแƒแƒžแƒ˜แƒ“แƒแƒœ. แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฌแƒ˜แƒœแƒ แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒคแƒ”แƒœแƒ”แƒ‘แƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒจแƒ˜. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฌแƒ˜แƒœแƒ build-แƒ˜แƒก แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก, Docker แƒ•แƒ”แƒ  แƒ˜แƒžแƒแƒ•แƒ˜แƒก แƒ›แƒ–แƒ แƒคแƒ”แƒœแƒ”แƒ‘แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒกแƒแƒ’แƒ”แƒ‘แƒแƒ“ nodejs-แƒ˜แƒ— (แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒ˜แƒก แƒ”แƒขแƒแƒžแƒ˜). แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“ แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒจแƒฃแƒแƒšแƒ”แƒ“แƒฃแƒ แƒ˜ แƒกแƒฃแƒ แƒแƒ—แƒ˜ $IMAGE_NAME-builder-stage แƒ“แƒ แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒก GitHub Packages-แƒ–แƒ”, แƒ แƒแƒ—แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› build-แƒจแƒ˜ แƒฅแƒ”แƒจแƒ˜แƒก แƒฌแƒงแƒแƒ แƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ.

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒฉแƒ”แƒ•แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒฉแƒฅแƒแƒ แƒแƒ— 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 แƒฌแƒแƒ›แƒแƒ›แƒ“แƒ”

แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒ”แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฉแƒฅแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—. แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ—, แƒ แƒแƒ› แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ›แƒแƒฎแƒ“แƒ”แƒก, แƒกแƒชแƒแƒ“แƒ”แƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ”แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜:

  • แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ;
  • แƒ›แƒชแƒ˜แƒ แƒ” แƒ–แƒแƒ›แƒ˜แƒก แƒ›แƒจแƒแƒ‘แƒšแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ;
  • แƒ›แƒ แƒแƒ•แƒแƒšแƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ˜แƒแƒœแƒ˜ แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ;
  • Dockerfile-แƒจแƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒฅแƒ”แƒจแƒ˜แƒก แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—;
  • แƒฅแƒ”แƒจแƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ CI/CD แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜;
  • แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ.

แƒ˜แƒ›แƒ”แƒ“แƒ˜ แƒ›แƒแƒฅแƒ•แƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒฃแƒคแƒ แƒ แƒœแƒแƒ—แƒ”แƒšแƒก แƒ’แƒแƒฎแƒ“แƒ˜แƒก แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก Docker แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒžแƒขแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒแƒ“ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก. แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒ“แƒแƒœ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ—แƒแƒœ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—, แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒ แƒกแƒแƒชแƒแƒ•แƒ˜ https://github.com/devopsprodigy/test-docker-build.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ