เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช—เชคเชฟ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชงเชพเชฐเชตเซ€ เชคเซ‡เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชŸเซ€เชชเซเชธ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 30 เชธเซ‡เช•เชจเซเชก เชธเซเชงเซ€

เชซเชฟเชšเชฐ เชชเซเชฐเซ‹เชกเช•เซเชถเชจเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚, เชœเชŸเชฟเชฒ เช“เชฐเซเช•เซ‡เชธเซเชŸเซเชฐเซ‡เชŸเชฐเซเชธ เช…เชจเซ‡ CI/CDเชจเชพ เช† เชฆเชฟเชตเชธเซ‹เชฎเชพเช‚, เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช…เชจเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชธเซเชงเซ€ เชชเซเชฐเชคเชฟเชฌเชฆเซเชงเชคเชพเชฅเซ€ เชฒเชˆเชจเซ‡ เชฒเชพเช‚เชฌเซ€ เชฎเชœเชฒ เช•เชพเชชเชตเชพเชจเซ€ เช›เซ‡. เชชเชนเซ‡เชฒเชพเช‚, เชคเชฎเซ‡ FTP เชฆเซเชตเชพเชฐเชพ เชจเชตเซ€ เชซเชพเช‡เชฒเซ‹ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เชคเชพ เชนเชคเชพ (เชนเชตเซ‡ เช•เซ‹เชˆ เชเชตเซเช‚ เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เช–เชฐเซเช‚?), เช…เชจเซ‡ "เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ" เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชธเซ‡เช•เชจเซเชกเชจเซ‹ เชธเชฎเชฏ เชฒเชพเช—เชคเซ‹ เชนเชคเซ‹. เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เชฎเชฐเซเชœ เชตเชฟเชจเช‚เชคเซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เชธเซเชตเชฟเชงเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชฒเชพเช‚เชฌเซ‹ เชธเชฎเชฏ เชฐเชพเชน เชœเซเช“.

เช† เชชเชพเชฅเชจเซ‹ เชเช• เชญเชพเช— เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡. เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชฟเชจเชฟเชŸเซ‹ เชธเซเชงเซ€ เชšเชพเชฒเซ‡ เช›เซ‡, เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชฆเชธ เชฎเชฟเชจเชฟเชŸ, เชœเซ‡เชจเซ‡ เชญเชพเช—เซเชฏเซ‡ เชœ เชธเชพเชฎเชพเชจเซเชฏ เช•เชนเซ€ เชถเช•เชพเชฏ. เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ เชเช• เชธเชฐเชณ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฒเชˆเชถเซเช‚ เชœเซ‡เชจเซ‡ เช…เชฎเซ‡ เชเช• เช›เชฌเซ€เชฎเชพเช‚ เชชเซ‡เช•เซ‡เชœ เช•เชฐเซ€เชถเซเช‚, เชฌเชฟเชฒเซเชกเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เชชเชฆเซเชงเชคเชฟเช“ เชฒเชพเช—เซ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เช† เชชเชฆเซเชงเชคเชฟเช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เช˜เซ‹เช‚เช˜เชพเชŸ เชœเซ‹เชˆเชถเซเช‚.

เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช—เชคเชฟ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชงเชพเชฐเชตเซ€ เชคเซ‡เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชŸเซ€เชชเซเชธ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 30 เชธเซ‡เช•เชจเซเชก เชธเซเชงเซ€

เช…เชฎเชจเซ‡ เชฎเซ€เชกเชฟเชฏเชพ เชตเซ‡เชฌเชธเชพเช‡เชŸเซเชธ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเชพเชฐเซ‹ เช…เชจเซเชญเชต เช›เซ‡: เชคเชพ.เชเชธ.เชเชธ., เช˜เช‚เชŸเชกเซ€, "เชจเชตเซเช‚ เช…เช–เชฌเชพเชฐ", เชฐเชฟเชชเชฌเซเชฒเชฟเช•โ€ฆ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชœ เช…เชฎเซ‡ เชชเซเชฐเซ‹เชกเช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชฌเชนเชพเชฐ เชชเชพเชกเซ€เชจเซ‡ เช…เชฎเชพเชฐเซ‹ เชชเซ‹เชฐเซเชŸเชซเซ‹เชฒเชฟเชฏเซ‹ เชตเชฟเชธเซเชคเชพเชฐเซเชฏเซ‹ เชนเชคเซ‹ เชฐเซ€เชฎเชพเช‡เชจเซเชกเชฐ. เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชจเชตเซ€ เชธเซเชตเชฟเชงเชพเช“ เชเชกเชชเชฅเซ€ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช…เชจเซ‡ เชœเซ‚เชจเซ€ เชญเซ‚เชฒเซ‹เชจเซ‡ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชคเซเชฏเชพเชฐเซ‡ เชงเซ€เชฎเซ€ เชœเชฎเชพเชตเชŸ เชเช• เชฎเซ‹เชŸเซ€ เชธเชฎเชธเซเชฏเชพ เชฌเชจเซ€ เชนเชคเซ€.

เช…เชฎเซ‡ GitLab เชฎเชพเช‚ เชœเชฎเชพเชตเชŸ เช•เชฐเซ€เช เช›เซ€เช. เช…เชฎเซ‡ เช›เชฌเซ€เช“ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช, เชคเซ‡เชฎเชจเซ‡ GitLab เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชฆเชฌเชพเชฃ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชฎเชพเชŸเซ‡ เชฌเชนเชพเชฐ เชชเชพเชกเซ€เช เช›เซ€เช. เช† เชธเซ‚เชšเชฟเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชฒเชพเช‚เชฌเซ€ เชตเชธเซเชคเซ เช เช‡เชฎเซ‡เชœ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซ€ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡: เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชตเชฟเชจเชพ, เชฆเชฐเซ‡เช• เชฌเซ‡เช•เชเชจเซเชก เชฌเชฟเชฒเซเชกเชฎเชพเช‚ 14 เชฎเชฟเชจเชฟเชŸเชจเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซเชฏเซ‹.

เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช—เชคเชฟ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชงเชพเชฐเชตเซ€ เชคเซ‡เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชŸเซ€เชชเซเชธ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 30 เชธเซ‡เช•เชจเซเชก เชธเซเชงเซ€

เช…เช‚เชคเซ‡, เชคเซ‡ เชธเซเชชเชทเซเชŸ เชฅเชˆ เช—เชฏเซเช‚ เช•เซ‡ เช…เชฎเซ‡ เชนเชตเซ‡ เช† เชฐเซ€เชคเซ‡ เชœเซ€เชตเซ€ เชถเช•เซ€เช เชจเชนเซ€เช‚, เช…เชจเซ‡ เช…เชฎเซ‡ เช†เช•เซƒเชคเชฟ เช•เชฐเชตเชพ เชฌเซ‡เช เชพ เช•เซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เช›เชฌเซ€เช“ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชŸเชฒเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€เชจเซ‹ เชธเชฎเชฏ 30 เชธเซ‡เช•เช‚เชก เชธเซเชงเซ€ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เชธเชซเชณ เชฅเชฏเชพ!

เชกเซ‹เช•เชฐ เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช—เชคเชฟ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชงเชพเชฐเชตเซ€ เชคเซ‡เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชŸเซ€เชชเซเชธ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 30 เชธเซ‡เช•เชจเซเชก เชธเซเชงเซ€

เช† เชฒเซ‡เช– เชฎเชพเชŸเซ‡, เชฐเซ€เชฎเชพเช‡เชจเซเชกเชฐเชจเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชธเชพเชฅเซ‡ เชฌเช‚เชงเชพเชฏเซ‡เชฒ เชจ เชฐเชนเซ‡เชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช–เชพเชฒเซ€ เช•เซ‹เชฃเซ€เชฏ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช. เชคเซ‹, เชšเชพเชฒเซ‹ เช…เชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€เช:

ng n app

เชคเซ‡เชฎเชพเช‚ PWA เช‰เชฎเซ‡เชฐเซ‹ (เช…เชฎเซ‡ เชชเซเชฐเช—เชคเชฟเชถเซ€เชฒ เช›เซ€เช):

ng add @angular/pwa --project app

เชœเซเชฏเชพเชฐเซ‡ เชเช• เชฎเชฟเชฒเชฟเชฏเชจ เชเชจเชชเซ€เชเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชกเชพเช‰เชจเชฒเซ‹เชก เชฅเชˆ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชšเชพเชฒเซ‹ เชœเชพเชฃเซ€เช เช•เซ‡ เชกเซ‹เช•เชฐ เชˆเชฎเซ‡เชœ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชกเซ‹เช•เชฐ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‡ เชชเซ‡เช•เซ‡เชœ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเชพ เช…เชฒเช— เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชšเชฒเชพเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เช…เชฒเช—เชคเชพ เชฎเชพเชŸเซ‡ เช†เชญเชพเชฐ, เชคเชฎเซ‡ เชเช• เชธเชฐเซเชตเชฐ เชชเชฐ เชเช•เชธเชพเชฅเซ‡ เช˜เชฃเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹. เช•เชจเซเชŸเซ‡เชจเชฐ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‹ เช•เชฐเชคเชพเช‚ เช–เซ‚เชฌ เชนเชณเชตเชพ เชนเซ‹เชฏ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เช“ เชธเชฟเชธเซเชŸเชฎ เช•เชฐเซเชจเชฒ เชชเชฐ เชธเซ€เชงเชพ เชœ เชšเชพเชฒเซ‡ เช›เซ‡. เช…เชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชพเชฐเซ‡ เชธเซŒเชชเซเชฐเชฅเชฎ เชเช• เช‡เชฎเซ‡เชœ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชคเซ‡ เชฌเชงเซเช‚ เชชเซ‡เช•เซ‡เชœ เช•เชฐเซ€เชถเซเช‚. เช…เชจเชฟเชตเชพเชฐเซเชฏเชชเชฃเซ‡, เช›เชฌเซ€ เช เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชจเช•เชฒ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ เชฒเซ‹:

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 MB เช•เชฐเชคเชพเช‚ 409 KB เช˜เชฃเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡. เช…เชฎเซ‡ เช‡เชฎเซ‡เชœเชจเซเช‚ เช•เชฆ เชชเชฃ 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 เชธเซ‡. เชœเซ‹ เชคเซ‡ เช–เซ‚เชฌ เชœ เชญเชพเช—เซเชฏเซ‡ เชœ เชฌเชฆเชฒเชพเชฏ เชคเซ‹ เชฆเชฐ เชตเช–เชคเซ‡ เช…เชตเชฒเช‚เชฌเชจ เชถเชพ เชฎเชพเชŸเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเซเช‚? เชšเชพเชฒเซ‹ เชœเชพเชฃเซ€เช เช•เซ‡ เชคเซ‡เช“ เช•เซ‡เชฎ เช•เซ‡เชถ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชจ เชนเชคเชพ. เชฎเซเชฆเซเชฆเซ‹ เช เช›เซ‡ เช•เซ‡ เชกเซ‹เช•เชฐ เช•เชฎเชพเชจเซเชก เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เชซเชพเชˆเชฒเซ‹ เชฌเชฆเชฒเชพเชˆ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชคเชฐ เชฆเซเชตเชพเชฐเชพ เชธเซเชคเชฐ เชคเชชเชพเชธเชถเซ‡. เชšเซ‹เชฅเชพ เชชเช—เชฒเชพ เชชเชฐ, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชฌเชงเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€, เช…เชฒเชฌเชคเซเชค, เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช›เซ‡, เชคเซ‡เชฅเซ€ เชกเซ‹เช•เชฐ เชซเช•เซเชค เช† เชธเซเชคเชฐเชจเซ‡ เช•เซ‡เชถเชฎเชพเช‚เชฅเซ€ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชชเช›เซ€เชจเซ€ เชฌเชงเซ€ เชซเชพเช‡เชฒเซ‹ เชชเชฃ เชฒเซ‡ เช›เซ‡! เชšเชพเชฒเซ‹ 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 เชธเซ‹เชฒเซเชฏเซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช, เชคเซ‹ เชธเซเชฅเชพเชจเชฟเช• เชกเซ‹เช•เชฐ เช•เซ‡เชถ เชธเซเชตเชšเซเช› เช…เชจเซ‡ เชคเชพเชœเซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชกเซ‹เช•เชฐเชจเซ‡ เชฌเซ‡เช• เช•เชฐเซ‡เชฒเชพ เชธเซเชคเชฐเซ‹ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชฅเชพเชจ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡เชจเซ‡ เช…เช—เชพเช‰เชจเซ€ เชฌเชฟเชฒเซเชŸ เช›เชฌเซ€ เช†เชชเซ‹.

เชšเชพเชฒเซ‹ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹