рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30 рд╕реЗрдХрдВрдб рддрдХ

рдХрд┐рд╕реА рдлреАрдЪрд░ рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬрдЯрд┐рд▓ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░ рдФрд░ рд╕реАрдЖрдИ/рд╕реАрдбреА рдХреЗ рдЗрди рджрд┐рдиреЛрдВ рдореЗрдВ, рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рддрд░рдг рддрдХ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рдЖрдк рдПрдлрд╝рдЯреАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирдИ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рдереЗ (рдЕрдм рдХреЛрдИ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛?), рдФрд░ "рдкрд░рд┐рдирд┐рдпреЛрдЬрди" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рдереЗред рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рддрдХ рд╕реБрд╡рд┐рдзрд╛ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдкрде рдХрд╛ рдПрдХ рднрд╛рдЧ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрднреА-рдХрднреА рд╕рднрд╛ рдорд┐рдирдЯреЛрдВ рддрдХ рдЪрд▓рддреА рд╣реИ, рдХрднреА-рдХрднреА рджрд╕рд┐рдпреЛрдВ рдорд┐рдирдЯ рддрдХ, рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд░рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рдЫрд╡рд┐ рдореЗрдВ рдкреИрдХреЗрдЬ рдХрд░реЗрдВрдЧреЗ, рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпреЗ рддрд░реАрдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30 рд╕реЗрдХрдВрдб рддрдХ

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореАрдбрд┐рдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрднрд╡ рд╣реИ: TASS, рдмреЗрд▓, "рдирдпрд╛ рдЕрдЦрдмрд╛рд░", рдЧрдгрддрдВрддреНрд░... рдЕрднреА рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рд╣рдордиреЗ рдПрдХ рдЙрддреНрдкрд╛рдж рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЬрд╛рд░реА рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдерд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ. рдФрд░ рдЬрдмрдХрд┐ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдЬреЛрдбрд╝реА рдЧрдИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдмрдЧ рдареАрдХ рдХрд┐рдП рдЧрдП, рдзреАрдореА рдЧрддрд┐ рд╕реЗ рддреИрдирд╛рддреА рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдмрди рдЧрдИред

рд╣рдо GitLab рдкрд░ рддреИрдирд╛рдд рд╣реИрдВред рд╣рдо рдЫрд╡рд┐рдпрд╛рдВ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ GitLab рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рд▓рдВрдмреА рдЪреАрдЬрд╝ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдмреИрдХрдПрдВрдб рдирд┐рд░реНрдорд╛рдг рдореЗрдВ 14 рдорд┐рдирдЯ рд▓рдЧреЗред

рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30 рд╕реЗрдХрдВрдб рддрдХ

рдЕрдВрдд рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╣рдо рдЕрдм рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗ, рдФрд░ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрда рдЧрдП рдХрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рдХреНрдпреЛрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЕрд╕реЗрдВрдмрд▓реА рд╕рдордп рдХреЛ 30 рд╕реЗрдХрдВрдб рддрдХ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд░рд╣реЗ!

рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30 рд╕реЗрдХрдВрдб рддрдХ

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рд░рд┐рдорд╛рдЗрдВрдбрд░ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдмрдВрдзреЗ рди рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдЦрд╛рд▓реА рдПрдВрдЧреБрд▓рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рддреЛ, рдЖрдЗрдП рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ:

ng n app

рдЗрд╕рдореЗрдВ PWA рдЬреЛрдбрд╝реЗрдВ (рд╣рдо рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВ):

ng add @angular/pwa --project app

рдЬрдмрдХрд┐ рджрд╕ рд▓рд╛рдЦ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдбреЙрдХрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреИрдХреЗрдЬ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдВрдЯреЗрдирд░ рдирд╛рдордХ рдПрдХ рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрд▓рдЧрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрдИ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╣рд▓реНрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕реАрдзреЗ рд╕рд┐рд╕реНрдЯрдо рдХрд░реНрдиреЗрд▓ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдкреИрдХреЗрдЬ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореВрд▓рддрдГ, рдПрдХ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Dockerfile рд▓реЗрдВ:

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 рдПрдордмреА рдмрд╣реБрдд рд╣реИ: рдЖрдЗрдП рд╕реЛрдЪреЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдВрджрд░реНрдн рдХреЛ рдХрдо рдХрд░рдирд╛

рд╕рдВрджрд░реНрдн рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдпрд╛ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдбреЙрдХрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ: рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрдпрд╛ рдирд╣реАрдВ рдШрд╕реАрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ .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 рдХреЗрдмреА 409 рдПрдордмреА рд╕реЗ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИред рд╣рдордиреЗ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рднреА 1.74 рд╕реЗ рдШрдЯрд╛рдХрд░ 1.38 рдЬреАрдмреА рдХрд░ рджрд┐рдпрд╛ рд╣реИ:

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

...рд▓рдЧрднрдЧ рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯред рдЖрдк рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЙрд▓реНрдпреВрдо рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд▓реНрдкрд╛рдЗрди рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ Linux рд╣реИ. рдЕрд▓реНрдкрд╛рдЗрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдиреЛрдбрдЬ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЫрд╡рд┐ рдХрд╛ рд╡рдЬрди рдХреЗрд╡рд▓ 88.5 рдПрдордмреА рд╣реИред рддреЛ рдЖрдЗрдП рдШрд░реЛрдВ рдореЗрдВ рдЕрдкрдиреА рдЬреАрд╡рдВрдд рдЫрд╡рд┐ рдмрджрд▓реЗрдВ:

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

рд╣рдореЗрдВ рдХреБрдЫ рдЪреАрдЬрд╝реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреА рдереАрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рд╣рд╛рдБ, Angular Python ┬п(┬░_o)/┬п рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ

рд▓реЗрдХрд┐рди рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдШрдЯрдХрд░ 150 рдПрдордмреА рд░рд╣ рдЧрдпрд╛:

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

рдЖрдЗрдП рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝реЗрдВ.

рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЬ рдЕрд╕реЗрдВрдмрд▓реА

рдЫрд╡рд┐ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рд╕рд╛рде docker run app ls -lah рд╣рдордиреЗ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ app рдФрд░ рдЗрд╕рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ ls -lahрдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХрдВрдЯреЗрдирд░ рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд┐рдпрд╛.

рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ dist. рдРрд╕реЗ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдмрд╛рд╣рд░ рджреЗрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЖрдк рдиреЛрдбрдЬ рдкрд░ рдХреБрдЫ HTTP рд╕рд░реНрд╡рд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗ. рдПрдХ рд░реВрд╕реА рд╢рдмреНрдж рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рд░ рдЕрдХреНрд╖рд░ "y" рд╣реЛрдВред рд╕рд╣реА! Ynzhynyksyред рдЖрдЗрдП nginx рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рд▓реЗрдВ, рдЙрд╕рдореЗрдВ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдбрд╛рд▓реЗрдВ dist рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рдиреНрдпрд╛рд╕:

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

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

рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдЕрдкрдирд╛ Dockerfile рдмрджрд▓реЗрдВ:

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

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

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ FROM рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ рдмрд┐рд▓реНрдб рдЪрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдмреБрд▓рд╛рдпрд╛ 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 рдЬреАрдмреА рд╕реЗ рдШрдЯрд╛рдХрд░ 36 рдПрдордмреА рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрддреНрдкрд╛рджрди рддрдХ рдкрд╣реБрдВрдЪрд╛рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдХрд╛рдлреА рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪрд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд╕рдордп рдкрд░ рд╡рд╛рдкрд╕ рдЪрд▓рддреЗ рд╣реИрдВред

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

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

рдкрд░рддреЛрдВ рдХрд╛ рдХреНрд░рдо рдмрджрд▓рдирд╛

рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рддреАрди рдЪрд░рдг рдХреИрд╢ рдХрд┐рдП рдЧрдП рдереЗ (рд╕рдВрдХреЗрдд)ред Using cache). рдЪреМрдереЗ рдЪрд░рдг рдореЗрдВ, рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреЙрдкреА рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рдЪрд░рдг рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ RUN npm ci - 47.338 рд╕реЗрдХрдВрдб рдЬрд┐рддрдирд╛ред рдпрджрд┐ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдмрд╣реБрдд рдХрдо рдмрджрд▓рддреА рд╣реИрдВ рддреЛ рд╣рд░ рдмрд╛рд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдкреБрдирдГ рд╕реНрдерд╛рдкрд┐рдд рдХреНрдпреЛрдВ рдХрд░реЗрдВ? рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЙрдХрд░ рдкрд░рдд рджрд░ рдкрд░рдд рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрдорд╛рдВрдб рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реА рдлрд╛рдЗрд▓реЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИрдВред рдЪреМрдереЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдбреЙрдХрд░ рди рдХреЗрд╡рд▓ рдЗрд╕ рдкрд░рдд рдХреЛ рдХреИрд╢ рд╕реЗ рд▓реЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдмрд╛рдж рдХреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рд▓реЗрддрд╛ рд╣реИ! рдЖрдЗрдП 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 рд╕реЗрдХрдВрдб - рдмрд╣реБрдд рдмреЗрд╣рддрд░! рдкрд░рддреЛрдВ рдХрд╛ рд╕рд╣реА рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдкрд╣рд▓реЗ рд╣рдо рд╡рд╣ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рдЬреЛ рдмрд╣реБрдд рдХрдо рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдмрджрд▓рддрд╛ рд╣реИред

рдЖрдЧреЗ, рд╕реАрдЖрдИ/рд╕реАрдбреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред

рдХреИрд╢ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдпрджрд┐ рд╣рдо рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ SaaS рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд╛рдиреАрдп рдбреЙрдХрд░ рдХреИрд╢ рд╕рд╛рдлрд╝ рдФрд░ рддрд╛рдЬрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбреЙрдХрд░ рдХреЛ рдкрдХреА рд╣реБрдИ рдкрд░рддреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдкрд┐рдЫрд▓реА рдирд┐рд░реНрдорд┐рдд рдЫрд╡рд┐ рджреЗрдВред

рдЖрдЗрдП GitHub Actions рдореЗрдВ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВред рд╣рдо рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

on:
  push:
    branches:
      - master

name: Test docker build

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

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

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

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

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

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

рдЫрд╡рд┐ рдХреЛ рджреЛ рдорд┐рдирдЯ рдФрд░ 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

рдЕрдм рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп Dockerfile рдореЗрдВ рд╣рдо рддреИрдпрд╛рд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

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

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдХрдо рдирд╣реАрдВ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЫрд╡рд┐рдпрд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреА рд╣реИрдВред

рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 30 рд╕реЗрдХрдВрдб рддрдХ

рд╣рдордиреЗ рдбреЙрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЛрдВ рдкрд░ рдЧреМрд░ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╢реАрдШреНрд░ рд╣реЛ, рддреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

  • рд╕рдВрджрд░реНрдн рдХреЛ рдХрдо рдХрд░рдирд╛;
  • рдЫреЛрдЯреА рдореВрд▓ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ;
  • рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЬ рдЕрд╕реЗрдВрдмрд▓реА;
  • рдХреИрд╢ рдХрд╛ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХреНрд░рдо рдмрджрд▓рдирд╛;
  • рд╕реАрдЖрдИ/рд╕реАрдбреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛;
  • рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдорд╛рдг.

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдбреЙрдХрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЕрдкрдиреА рддреИрдирд╛рддреА рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рднрдВрдбрд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ https://github.com/devopsprodigy/test-docker-build.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ