เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจ•เจฟเจธเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจฆเฉ‡ เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจ†เจ‰เจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ†เจฐเจ•เฉˆเจธเจŸเจฐเฉ‡เจŸเจฐเจพเจ‚ เจ…เจคเฉ‡ CI/CD เจฆเฉ‡ เจ‡เจนเจจเจพเจ‚ เจฆเจฟเจจเจพเจ‚ เจตเจฟเฉฑเจš, เจŸเฉˆเจธเจŸเจพเจ‚ เจ…เจคเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจคเฉฑเจ• เจตเจšเจจเจฌเฉฑเจงเจคเจพ เจคเฉ‹เจ‚ เจฒเฉˆ เจ•เฉ‡ เจ‡เฉฑเจ• เจฒเฉฐเจฎเจพ เจธเจซเจผเจฐ เจคเฉˆเจ… เจ•เจฐเจจเจพ เจนเฉˆเฅค เจชเจนเจฟเจฒเจพเจ‚, เจคเฉเจธเฉ€เจ‚ FTP เจฐเจพเจนเฉ€เจ‚ เจจเจตเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจ…เฉฑเจชเจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจนเฉเจฃ เจ…เจœเจฟเจนเจพ เจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ, เจ เฉ€เจ• เจนเฉˆ?), เจ…เจคเฉ‡ "เจกเจฟเจชเจฒเจพเจ‡เจฎเฉˆเจ‚เจŸ" เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจฒเฉฑเจ—เฉ€เจ†เจ‚เฅค เจนเฉเจฃ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฟเจฒเฉ€เจจเจคเจพ เจฌเฉ‡เจจเจคเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจคเฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฃ เจฒเจˆ เจฒเฉฐเจฎเจพ เจธเจฎเจพเจ‚ เจ‰เจกเฉ€เจ• เจ•เจฐเจจเฉ€ เจชเจตเฉ‡เจ—เฉ€เฅค

เจ‡เจธ เจฎเจพเจฐเจ— เจฆเจพ เจนเจฟเฉฑเจธเจพ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจ•เจˆ เจตเจพเจฐ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฎเจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ• เจšเฉฑเจฒเจฆเฉ€ เจนเฉˆ, เจ•เจˆ เจตเจพเจฐ เจ•เจˆ เจฎเจฟเฉฐเจŸเจพเจ‚ เจฆเฉ€, เจœเจฟเจธ เจจเฉ‚เฉฐ เจธเจผเจพเจ‡เจฆ เจนเฉ€ เจ†เจฎ เจ•เจฟเจนเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจตเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจชเฉˆเจ• เจ•เจฐเจพเจ‚เจ—เฉ‡, เจฌเจฟเจฒเจก เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฒเจˆ เจ•เจˆ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ…เจคเฉ‡ เจ‡เจนเจจเจพเจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจฌเจพเจฐเฉ€เจ•เฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡เฅค

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฎเฉ€เจกเฉ€เจ† เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจจ เจฆเจพ เจšเฉฐเจ—เจพ เจ…เจจเฉเจญเจต เจนเฉˆ: เจŸเจพเจธ, เจฌเฉˆเฉฑเจฒ, "เจจเจตเจพเจ‚ เจ…เจ–เจฌเจพเจฐ", เจ—เจฃเจคเฉฐเจคเจฐโ€ฆ เจ•เฉเจ เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‰เจคเจชเจพเจฆ เจฆเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ เจœเจพเจฐเฉ€ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเฉ‡ เจชเฉ‹เจฐเจŸเจซเฉ‹เจฒเฉ€เจ“ เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจ•เฉ€เจคเจพ เจธเฉ€ เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ. เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจฌเฉฑเจ— เจซเจฟเจ•เจธ เจ•เฉ€เจคเฉ‡ เจ—เจ เจธเจจ, เจนเฉŒเจฒเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจ‡เฉฑเจ• เจตเฉฑเจกเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฌเจฃ เจ—เจˆเฅค

เจ…เจธเฉ€เจ‚ GitLab เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ…เจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ GitLab เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจงเฉฑเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจฐเฉ‹เจฒ เจ†เจŠเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจธเจญ เจคเฉ‹เจ‚ เจฒเฉฐเจฌเฉ€ เจšเฉ€เจœเจผ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจนเฉˆ. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ: เจฌเจฟเจจเจพเจ‚ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฆเฉ‡, เจนเจฐเฉ‡เจ• เจฌเฉˆเจ•เจเจ‚เจก เจฌเจฟเจฒเจก เจตเจฟเฉฑเจš 14 เจฎเจฟเฉฐเจŸ เจฒเฉฑเจ—เฉ‡เฅค

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹ เจ—เจฟเจ† เจ•เจฟ เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจจเจนเฉ€เจ‚ เจฐเจนเจฟ เจธเจ•เจฆเฉ‡, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจน เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ เจฌเฉˆเจ  เจ—เจ เจ•เจฟ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ‡เฉฐเจจเจพ เจธเจฎเจพเจ‚ เจ•เจฟเจ‰เจ‚ เจฒเฉฑเจ— เจฐเจฟเจนเจพ เจนเฉˆเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจจเฉ‚เฉฐ 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ• เจ˜เจŸเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจ•เจพเจฎเจฏเจพเจฌ เจฐเจนเฉ‡!

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจ‡เจธ เจฒเฉ‡เจ– เจฒเจˆ, เจฐเฉ€เจฎเจพเจˆเจ‚เจกเจฐ เจฆเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจจเจพเจฒ เจจเจพ เจฌเฉฐเจจเฉเจนเฉ‡ เจœเจพเจฃ เจฒเจˆ, เจ†เจ‰ เจ‡เฉฑเจ• เจ–เจพเจฒเฉ€ เจเจ‚เจ—เฉเจฒเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ…เจธเฉˆเจ‚เจฌเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจตเฉ‡เจ–เฉ€เจเฅค เจ‡เจธ เจฒเจˆ, เจ†เจ“ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจˆเจ:

ng n app

เจ‡เจธ เจตเจฟเฉฑเจš PWA เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ (เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจ—เจคเฉ€เจธเจผเฉ€เจฒ เจนเจพเจ‚):

ng add @angular/pwa --project app

เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจฎเจฟเจฒเฉ€เจ…เจจ npm เจชเฉˆเจ•เฉ‡เจœ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ, เจ†เจ“ เจ‡เจน เจชเจคเจพ เจ•เจฐเฉ€เจ เจ•เจฟ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจกเฉŒเจ•เจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉˆเจ•เฉ‡เจœ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ†เจˆเจธเฉ‹เจฒเฉ‡เจธเจผเจจ เจฒเจˆ เจงเฉฐเจจเจตเจพเจฆ, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจฐเจตเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจ•เจˆ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจนเจฒเจ•เฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจธเจฟเจธเจŸเจฎ เจ•เจฐเจจเจฒ 'เจคเฉ‡ เจธเจฟเฉฑเจงเฉ‡ เจšเฉฑเจฒเจฆเฉ‡ เจนเจจเฅค เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจนเจฐ เจ‰เจน เจšเฉ€เจœเจผ เจชเฉˆเจ•เฉ‡เจœ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจซเจพเจ‡เจฒ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจ‡เฉฑเจ• เจ•เจพเจชเฉ€ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจฒเจ“:

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

เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉˆ; เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจจเฉ‚เฉฐ เจ•เจฐเจจ เจจเจพเจฒ, เจกเฉŒเจ•เจฐ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฟเจ›เจฒเฉ€เจ†เจ‚ เจ‰เฉฑเจคเฉ‡ เจ“เจตเจฐเจฒเฉ‡ เจ•เจฐเฉ‡เจ—เจพเฅค เจนเจฐ เจŸเฉ€เจฎ เจ†เจชเจฃเฉ€ เจชเจฐเจค เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค เจ…เจคเฉ‡ เจฎเฉเจ•เฉฐเจฎเจฒ เจšเจฟเฉฑเจคเจฐ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค

เจ•เฉ€ เจœเจพเจฃเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ: เจนเจฐเฉ‡เจ• เจกเฉŒเจ•เจฐ เจฒเฉ‡เจ…เจฐ เจ•เฉˆเจธเจผ เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆ. เจœเฉ‡เจ•เจฐ เจ†เจ–เจฐเฉ€ เจฌเจฟเจฒเจก เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฌเจœเจพเจ, เจกเฉŒเจ•เจฐ เจ‡เฉฑเจ• เจคเจฟเจ†เจฐ-เจฌเจฃเจพเจˆ เจชเจฐเจค เจฒเจตเฉ‡เจ—เจพเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฌเจฟเจฒเจก เจธเจชเฉ€เจก เจตเจฟเฉฑเจš เจฎเฉเฉฑเจ– เจตเจพเจงเจพ เจ•เฉˆเจธเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจ•เจพเจฐเจจ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจœเจฆเฉ‹เจ‚ เจฌเจฟเจฒเจก เจธเจชเฉ€เจก เจจเฉ‚เฉฐ เจฎเจพเจชเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฐเฉˆเจกเฉ€เจฎเฉ‡เจก เจ•เฉˆเจš เจจเจพเจฒ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡เฅค เจ‡เจธ เจฒเจˆ, เจ•เจฆเจฎ เจฆเจฐ เจ•เจฆเจฎ:

  1. เจ…เจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเจฟเจŸเจพ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจ•เจฟ เจชเจฟเจ›เจฒเฉ€เจ†เจ‚ เจฆเฉŒเฉœเจพเจ‚ เจŸเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจจเจพ เจ•เจฐเจจเฅค
    docker rmi $(docker images -q)
  2. เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจฌเจฟเจฒเจก เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค
    time docker build -t app .
  3. เจ…เจธเฉ€เจ‚ src/index.html เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฆเฉ‡ เจนเจพเจ‚ - เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐ เจฆเฉ‡ เจ•เฉฐเจฎ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚.
  4. เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒเจก เจจเฉ‚เฉฐ เจฆเฉ‚เจœเฉ€ เจตเจพเจฐ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค
    time docker build -t app .

เจœเฉ‡ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจตเจพเจคเจพเจตเจฐเจฃ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจนเฉ‡เจ เจพเจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ), เจคเจพเจ‚ เจœเจฆเฉ‹เจ‚ เจฌเจฟเจฒเจก เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจกเฉŒเจ•เจฐ เจ•เฉ‹เจฒ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฌเฉ‹เจฐเจก 'เจคเฉ‡ เจ•เฉˆเจšเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจธเจพเจกเจพ เจ•เฉฐเจฎ เจ‡เจน เจธเจฟเฉฑเจ–เจฃเจพ เจนเฉˆ เจ•เจฟ เจ•เฉˆเจธเจผ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจจเฉ€ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจฌเจฟเจฒเจก เจœเจฟเฉฐเจจเฉ€ เจœเจฒเจฆเฉ€ เจนเฉ‹ เจธเจ•เฉ‡. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจน เจฎเฉฐเจจ เจฐเจนเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจ•เฉˆเจธเจผ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจฌเจฟเจฒเจก เจšเจฒเจพเจ‰เจฃเจพ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจตเจพเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ - เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ - เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฒเจˆ เจ…เจฃเจกเจฟเฉฑเจ  เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจ•เจฟเฉฐเจจเฉ€ เจนเฉŒเจฒเฉ€ เจธเฉ€เฅค เจŸเฉˆเจธเจŸเจพเจ‚ เจตเจฟเฉฑเจš, เจฌเจฟเจฒเจก เจฆเจพ เจฆเฉ‚เจœเจพ เจฐเจจ เจธเจพเจกเฉ‡ เจฒเจˆ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเจฆเฉ‹เจ‚ เจ•เฉˆเจš เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ—เจฐเจฎ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ•เฉ‡เจ• เจจเฉ‚เฉฐ เจธเฉ‡เจ•เจฃ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เฉเจ เจธเฉเจเจพเจ… เจชเจนเจฟเจฒเฉ‡ เจฌเจฟเจฒเจก เจจเฉ‚เฉฐ เจตเฉ€ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เจฐเจจเจ—เฉ‡เฅค

เจ†เจ‰ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ‡ เจ—เจ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจชเจพเจ“ เจ…เจคเฉ‡ เจฌเจฟเจฒเจก เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจเฅค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเฉ‚เจšเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจฆเฉ€ เจธเฉŒเจ– เจฒเจˆ เจธเฉฐเจ˜เจฃเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

$ 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. เจฌเจฟเจฒเจก เจธเฉฐเจฆเจฐเจญ เจจเฉ‚เฉฐ เจฌเจฟเจฒเจก เจ•เจฎเจพเจ‚เจก เจฒเจˆ เจ†เจ–เจฐเฉ€ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจตเจœเฉ‹เจ‚ เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆเฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เจน เจฎเฉŒเจœเฉ‚เจฆเจพ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจนเฉˆ - ".", - เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจนเจฐ เจšเฉ€เจœเจผ เจจเฉ‚เฉฐ เจ–เจฟเฉฑเจšเจฆเจพ เจนเฉˆ เจœเฉ‹ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เจธ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจนเฉˆ. 409 MB เจฌเจนเฉเจค เจนเฉˆ: เจ†เจ“ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเฉ‹เจšเฉ€เจ เจ•เจฟ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ เฉ€เจ• เจ•เจฐเจจเจพ เจนเฉˆ.

เจธเฉฐเจฆเจฐเจญ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃเจพ

เจธเฉฐเจฆเจฐเจญ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃ เจฒเจˆ, เจฆเฉ‹ เจตเจฟเจ•เจฒเจช เจนเจจ. เจœเจพเจ‚ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจชเจพเจ“ เจ…เจคเฉ‡ เจกเฉŒเจ•เจฐ เจธเฉฐเจฆเจฐเจญ เจจเฉ‚เฉฐ เจ‡เจธ เจซเฉ‹เจฒเจกเจฐ เจตเฉฑเจฒ เจชเฉเจ†เจ‡เฉฐเจŸ เจ•เจฐเฉ‹เฅค เจ‡เจน เจนเจฎเฉ‡เจธเจผเจพ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ…เจชเจตเจพเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉˆ: เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš เจ•เฉ€ เจจเจนเฉ€เจ‚ เจ–เจฟเฉฑเจšเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš .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 เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš. เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ‰เจฌเฉฐเจŸเฉ‚-เจ…เจงเจพเจฐเจฟเจค เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจœเจฟเจธ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจจเฉ‹เจกเจœ เจธเจฅเจพเจชเจค เจนเจจเฅค เจ…เจคเฉ‡ เจ‡เจธเจฆเจพ เจญเจพเจฐ เจนเฉˆ ...

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

... เจฒเจ—เจญเจ— เจ‡เฉฑเจ• เจ—เฉ€เจ—เจพเจฌเจพเจˆเจŸเฅค เจคเฉเจธเฉ€เจ‚ เจเจฒเจชเจพเจˆเจจ เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจพเจฒเฉ€เจ…เจฎ เจจเฉ‚เฉฐ เจ•เจพเจซเจผเฉ€ เจ˜เจŸเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจเจฒเจชเจพเจˆเจจ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจ›เฉ‹เจŸเจพ เจฒเฉ€เจจเจ•เจธ เจนเฉˆเฅค เจ…เจฒเจชเจพเจˆเจจ 'เจคเฉ‡ เจ…เจงเจพเจฐเจค เจจเฉ‹เจกเจœ เจฒเจˆ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจฆเจพ เจญเจพเจฐ เจธเจฟเจฐเจซ 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

เจธเจพเจจเฉ‚เฉฐ เจ•เฉเจ เจšเฉ€เจœเจผเจพเจ‚ เจธเจฅเจพเจชเจค เจ•เจฐเจจเฉ€เจ†เจ‚ เจชเจˆเจ†เจ‚ เจœเฉ‹ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเจจเฅค เจนเจพเจ‚, เจเจ‚เจ—เฉเจฒเจฐ เจชเจพเจˆเจฅเจจ ยฏ(ยฐ_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 เจธเจฐเจตเจฐ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจชเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจธเจพเจจ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡เฅค เจ‡เฉฑเจ• เจฐเฉ‚เจธเฉ€ เจธเจผเจฌเจฆ เจฆเจพ เจ…เจจเฉเจฎเจพเจจ เจฒเจ—เจพเจ“ เจœเจฟเจธ เจตเจฟเฉฑเจš เจšเจพเจฐ เจ…เฉฑเจ–เจฐ โ€œ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;
    }
}

เจฎเจฒเจŸเฉ€-เจธเจŸเฉ‡เจœ เจฌเจฟเจฒเจก เจ‡เจน เจธเจญ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจธเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพเฅค เจ†เจ“ เจ†เจชเจฃเฉ€ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ€เจ:

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 เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš, เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจฌเจฟเจฒเจก เจธเจŸเฉˆเจช เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเฉ‡ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† 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/ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจ…เจฐเจœเจผเฉ€ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚เฅค เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ!

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 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.338 เจธเจ•เจฟเฉฐเจŸเฅค เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเจฐ เจตเจพเจฐ เจฎเฉเฉœ-เจธเจฅเจพเจชเจฟเจค เจ•เจฟเจ‰เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจ‰เจน เจฌเจนเฉเจค เจ˜เฉฑเจŸ เจฌเจฆเจฒเจฆเฉ‡ เจนเจจ? เจ†เจ“ เจ‡เจน เจชเจคเจพ เจ•เจฐเฉ€เจ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจ•เจฟเจ‰เจ‚ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจฌเจฟเฉฐเจฆเฉ‚ เจ‡เจน เจนเฉˆ เจ•เจฟ เจกเฉŒเจ•เจฐ เจ‡เจน เจตเฉ‡เจ–เจฃ เจฒเจˆ เจฒเฉ‡เจ…เจฐ เจฆเจฐ เจชเจฐเจค เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‡เจ—เจพ เจ•เจฟ เจ•เฉ€ เจ•เจฎเจพเจ‚เจก เจ…เจคเฉ‡ เจ‡เจธ เจจเจพเจฒ เจœเฉเฉœเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฌเจฆเจฒ เจ—เจˆเจ†เจ‚ เจนเจจ. เจšเฉŒเจฅเฉ‡ เจชเฉœเจพเจ… 'เจคเฉ‡, เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš, เจฌเฉ‡เจธเจผเฉฑเจ•, เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจนเจจ, เจ‡เจธเจฒเจˆ เจกเฉŒเจ•เจฐ เจจเจพ เจธเจฟเจฐเจซ เจ‡เจธ เจชเจฐเจค เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจคเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆ, เจฌเจฒเจ•เจฟ เจธเจพเจฐเฉ€เจ†เจ‚ เจ…เจ—เจฒเฉ€เจ†เจ‚ เจตเฉ€! เจ†เจ“ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ•เฉเจ เจ›เฉ‹เจŸเฉ‡ เจฌเจฆเจฒเจพเจ… เจ•เจฐเฉ€เจเฅค

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 เจนเฉฑเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจธเจฅเจพเจจเจ• เจกเฉŒเจ•เจฐ เจ•เฉˆเจธเจผ เจธเจพเจซเจผ เจ…เจคเฉ‡ เจคเจพเจœเจผเจพ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ. เจกเฉŒเจ•เจฐ เจจเฉ‚เฉฐ เจฌเฉ‡เจ•เจก เจฒเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจœเจ—เฉเจนเจพ เจฆเฉ‡เจฃ เจฒเจˆ, เจ‰เจธเจจเฉ‚เฉฐ เจชเจฟเจ›เจฒเฉ€ เจฌเจฃเจพเจˆ เจ—เจˆ เจšเจฟเฉฑเจคเจฐ เจฆเจฟเจ“เฅค

เจ†เจ‰ GitHub เจเจ•เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆเจเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚

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

เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฆเฉ‹ เจฎเจฟเฉฐเจŸ เจ…เจคเฉ‡ 20 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš GitHub เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจตเจฟเฉฑเจš เจงเฉฑเจ•เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ:

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 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. เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจฎเจฒเจŸเฉ€เจธเจŸเฉ‡เจœ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจตเจฟเฉฑเจš เจจเจคเฉ€เจœเจพ เจšเจฟเฉฑเจคเจฐ เจ†เจ–เจฐเฉ€ เจชเฉœเจพเจ… เจคเฉ‹เจ‚ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉ‹เจตเฉ‡เจ—เจพ. เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจชเจฟเจ›เจฒเฉ€เจ†เจ‚ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจคเฉ‹เจ‚ เจชเจฐเจคเจพเจ‚ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚เฅค เจ‡เจธ เจฒเจˆ, เจชเจฟเจ›เจฒเฉ‡ เจฌเจฟเจฒเจก เจคเฉ‹เจ‚ เจ…เฉฐเจคเจฟเจฎ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจกเฉŒเจ•เจฐ เจจเฉ‹เจกเจœ (เจฌเจฟเจฒเจกเจฐ เจชเฉœเจพเจ…) เจจเจพเจฒ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจคเจฟเจ†เจฐ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจธ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจตเจฟเจšเจ•เจพเจฐเจฒเจพ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ $IMAGE_NAME-builder-stage เจ…เจคเฉ‡ GitHub เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ 'เจคเฉ‡ เจงเฉฑเจ•เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจธ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจธเจฐเฉ‹เจค เจตเจœเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฆเฉ‡ เจฌเจฟเจฒเจก เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เฉ‡เฅค

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจ•เฉเฉฑเจฒ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฆเจพ เจธเจฎเจพเจ‚ เจ˜เจŸเจพ เจ•เฉ‡ เจกเฉ‡เจข เจฎเจฟเฉฐเจŸ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ†เฅค เจชเจฟเจ›เจฒเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจ–เจฟเฉฑเจšเจฃ เจตเจฟเฉฑเจš เจ…เฉฑเจงเจพ เจฎเจฟเฉฐเจŸ เจฌเจฟเจคเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจชเฉเจฐเฉ€เจ‡เจฎเฉ‡เจœเจฟเฉฐเจ—

เจ‡เฉฑเจ• เจธเจพเจซเจผ เจกเฉŒเจ•เจฐ เจ•เฉˆเจธเจผ เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจ•เฉเจ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฒเจฟเจœเจพเจฃเจพ, เจ‡เจธเจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจฃเจพเจ‰เจฃเจพ, เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจงเฉฑเจ•เจฃเจพ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฎเจพเจคเจพ-เจชเจฟเจคเจพ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฃเจพ เจนเฉˆเฅค

เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจเจ‚เจ—เฉเจฒเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ†เจชเจฃเจพ เจจเฉ‹เจกเจœ เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš Dockerfile.node เจฌเจฃเจพเจ“

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

เจ…เจธเฉ€เจ‚ เจกเฉŒเจ•เจฐ เจนเฉฑเจฌ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจœเจจเจคเจ• เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจงเฉฑเจ•เจฆเฉ‡ เจนเจพเจ‚:

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

เจนเฉเจฃ เจธเจพเจกเฉ€ เจฎเฉเฉฑเจ– เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฎเฉเจ•เฉฐเจฎเจฒ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

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

เจธเจพเจกเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจฌเจฟเจฒเจก เจŸเจพเจˆเจฎ เจ˜เฉฑเจŸ เจจเจนเฉ€เจ‚ เจนเฉ‹เจ‡เจ† เจนเฉˆ, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฃเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจนเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจตเจฟเฉฑเจš เจ‡เฉฑเจ•เฉ‹ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆเฅค

เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจธเฉเจเจพเจ…เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 30 เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจคเฉฑเจ•

เจ…เจธเฉ€เจ‚ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ‡ เจจเจฟเจฐเจฎเจพเจฃ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผ เจ•เจฐเจจ เจฒเจˆ เจ•เจˆ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจตเฉฑเจฒ เจฆเฉ‡เจ–เจฟเจ†. เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจคเฉˆเจจเจพเจคเฉ€ เจœเจฒเจฆเฉ€ เจนเฉ‹ เจœเจพเจตเฉ‡, เจคเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจตเจฐเจคเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ‹:

  • เจธเฉฐเจฆเจฐเจญ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃเจพ;
  • เจ›เฉ‹เจŸเฉ‡ เจฎเจพเจคเจพ-เจชเจฟเจคเจพ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚;
  • เจฎเจฒเจŸเฉ€เจธเจŸเฉ‡เจœ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€;
  • เจ•เฉˆเจธเจผ เจฆเฉ€ เจ•เฉเจธเจผเจฒ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ;
  • CI/CD เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉˆเจธเจผ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ;
  • เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจฐเจšเจจเจพเฅค

เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจ‰เจฆเจพเจนเจฐเจจ เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เฉ€ เจ•เจฟ เจกเฉŒเจ•เจฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจตเจงเฉ€เจ† เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเฉ‹เจ—เฉ‡. เจฒเฉ‡เจ– เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจจเจพเจฒ เจ–เฉ‡เจกเจฃ เจฒเจˆ, เจ‡เฉฑเจ• เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฌเจฃเจพเจˆ เจ—เจˆ เจนเฉˆ https://github.com/devopsprodigy/test-docker-build.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹