рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рдмрдирд╡рдгреНрдпрд╛рдЪрд╛ рд╡реЗрдЧ рдХрд╕рд╛ рд╡рд╛рдврд╡рд╛рдпрдЪрд╛ рдпрд╛рд╡рд░реАрд▓ рдХрд╛рд╣реА рдЯрд┐рдкрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, 30 рд╕реЗрдХрдВрджрд╛рдВрдкрд░реНрдпрдВрдд

рдПрдЦрд╛рджреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЙрддреНрдкрд╛рджрдирд╛рдд рдпреЗрдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдЬрдЯрд┐рд▓ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░ рдЖрдгрд┐ рд╕реАрдЖрдп/рд╕реАрдбреАрдЪреНрдпрд╛ рдпрд╛ рджрд┐рд╡рд╕рд╛рдВрдордзреНрдпреЗ, рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╡рд┐рддрд░рдгрд╛рдкрд░реНрдпрдВрдд рдЦреВрдк рдореЛрдард╛ рдкрд▓реНрд▓рд╛ рдЧрд╛рдард╛рдпрдЪрд╛ рдЖрд╣реЗ. рдкреВрд░реНрд╡реА, рддреБрдореНрд╣реА 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 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, рдкрд░рдВрддреБ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдкрд╛рд╕реВрди рд╕реБрд░реВ рдХрд░реВрди, рдЖрдордЪреА рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдИрд▓. рд╢реЗрд╡рдЯрдЪреА рдкрд╛рдпрд░реА рдореНрд╣рдгрдЬреЗ nginx рд╕рд╣ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдореЗрдордзреНрдпреЗ рдорд╛рдЧреАрд▓ рдЪрд░рдгрд╛рдд рдЖрдордЪреНрдпрд╛ рдЕрд╕реЗрдВрдмрд▓реАрдЪреА рдХрд▓рд╛рдХреГрддреА рдХреЙрдкреА рдХрд░рдгреЗ. рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдЖрдХрд╛рд░ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдХрдореА рдЭрд╛рд▓рд╛ рдЖрд╣реЗ:

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

рдЪрд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдореЗрд╕рд╣ рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡реВ рдЖрдгрд┐ рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛:

docker run -p8080:80 app

-p8080:80 рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рд╣реЛрд╕реНрдЯ рдорд╢реАрдирд╡рд░реАрд▓ рдкреЛрд░реНрдЯ 8080 рд▓рд╛ nginx рдЪрд╛рд▓рд╡рд▓реЗрд▓реНрдпрд╛ рдХрдВрдЯреЗрдирд░рдЪреНрдпрд╛ рдЖрдд рдкреЛрд░реНрдЯ 80 рд╡рд░ рдлреЙрд░рд╡рд░реНрдб рдХреЗрд▓реЗ. рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЙрдШрдбрд╛ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛