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

рдХреБрдиреИ рд╕реБрд╡рд┐рдзрд╛ рдЙрддреНрдкрд╛рджрдирдорд╛ рдЖрдЙрдиреБ рдЕрдШрд┐, рдЬрдЯрд┐рд▓ рдЕрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрдЯрд░рд╣рд░реВ рд░ CI/CD рдХреЛ рджрд┐рдирд╣рд░реВрдорд╛, рдкрд░реАрдХреНрд╖рдг рд░ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдмрд╛рдЯ рдЬрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рд▓рд╛рдореЛ рдмрд╛рдЯреЛ рдЫред рдкрд╣рд┐рд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ FTP рдорд╛рд░реНрдлрдд рдирдпрд╛рдБ рдлрд╛рдЗрд▓рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдереНрдпреЛ (рдЕрдм рдХрд╕реИрд▓реЗ рддреНрдпрд╕реЛ рдЧрд░реНрджреИрди, рд╕рд╣реА?), рд░ "рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ" рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓реЗ рд╕реЗрдХреЗрдиреНрдб рд▓рд┐рдпреЛред рдЕрдм рддрдкрд╛рдЗрдБрд▓реЗ рдПрдХ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реБ рд╕рдореНрдо рдкреБрдЧреНрди рдХреЛ рд▓рд╛рдЧреА рдзреЗрд░реИ рд╕рдордп рдкрд░реНрдЦрдиреБрд╣реЛрд╕реНред

рдпрд╕ рдорд╛рд░реНрдЧрдХреЛ рдЕрдВрд╢ рдбрдХрд░ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИрдЫред рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рд╕рднрд╛ рдорд┐рдиреЗрдЯ, рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рджрд╕реМрдВ рдорд┐рдиреЗрдЯ, рдЬрд╕рд▓рд╛рдИ рд╕рд╛рдорд╛рдиреНрдп рднрдиреНрди рд╕рдХрд┐рдБрджреИрдиред рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд┐рдиреЗрдЫреМрдВ рдЬреБрди рд╣рд╛рдореА рдЫрд╡рд┐рдорд╛ рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реНрдиреЗрдЫреМрдВ, рдирд┐рд░реНрдорд╛рдгрдХреЛ рдЧрддрд┐ рдмрдврд╛рдЙрди рдзреЗрд░реИ рд╡рд┐рдзрд┐рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рдпреА рд╡рд┐рдзрд┐рд╣рд░реВрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рд╕реВрдХреНрд╖реНрдорддрд╛рд╣рд░реВ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред

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

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

рд╣рд╛рдореА 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 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

ремрежрен.реи KB 607.2 MB рднрдиреНрджрд╛ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫред рд╣рд╛рдореАрд▓реЗ рддрд╕реНрдмрд┐рд░рдХреЛ рд╕рд╛рдЗрдЬ рдкрдирд┐ рез.ренрек рдмрд╛рдЯ рез.рейрео рдЬреАрдмреАрдорд╛ рдШрдЯрд╛рдПрдХрд╛ рдЫреМрдВ:

REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
app          latest   4942f010792a   3 minutes ago   1.38GB

рдЕрдЭ рдЫрд╡рд┐рдХреЛ рдЖрдХрд╛рд░ рдШрдЯрд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВред

рд╣рд╛рдореА рдЕрд▓реНрдкрд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ

рдЫрд╡рд┐ рдЖрдХрд╛рд░рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреЗ рдЕрд░реНрдХреЛ рддрд░рд┐рдХрд╛ рд╕рд╛рдиреЛ рдЕрднрд┐рднрд╛рд╡рдХ рдЫрд╡рд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛред рдЕрднрд┐рднрд╛рд╡рдХреАрдп рдЫрд╡рд┐ рддреНрдпреЛ рдЫрд╡рд┐ рд╣реЛ рдЬрд╕рдХреЛ рдЖрдзрд╛рд░рдорд╛ рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐ рддрдпрд╛рд░ рд╣реБрдиреНрдЫред рддрд▓ рддрд╣ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ FROM Dockerfile рдорд╛ред рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╣рд╛рдореА Ubuntu-рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫреМрдВ рдЬреБрди рдкрд╣рд┐рд▓реЗ рдиреИ рдиреЛрдбрдЬрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рд░ рдпреЛ рддреМрд▓...

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

... рд▓рдЧрднрдЧ рдПрдХ рдЧрд┐рдЧрд╛рдмрд╛рдЗрдЯред рддрдкрд╛рдИрдВ рдЕрд▓реНрдкрд╛рдЗрди рд▓рд┐рдирдХреНрд╕рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫрд╡рд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рднреЛрд▓реНрдпреБрдорд▓рд╛рдИ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдХрдо рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЕрд▓реНрдкрд╛рдЗрди рдПрдХ рдзреЗрд░реИ рд╕рд╛рдиреЛ рд▓рд┐рдирдХреНрд╕ рд╣реЛред рдЕрд▓реНрдкрд╛рдЗрдирдорд╛ рдЖрдзрд╛рд░рд┐рдд рдиреЛрдбрдЬрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрдХрд░ рдЫрд╡рд┐рдХреЛ рддреМрд▓ рдорд╛рддреНрд░ 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 рдкрд╛рдЗрдерди ┬п(┬░_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;
    }
}

рдмрд╣реБ-рдЪрд░рдг рдирд┐рд░реНрдорд╛рдгрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛ рд╕рдмреИ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рд╣рд╛рдореНрд░реЛ Dockerfile рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реМрдВ:

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

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

рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рджреБрдИрд╡рдЯрд╛ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЫрдиреН FROM Dockerfile рдорд╛, рддрд┐рдиреАрд╣рд░реВ рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдлрд░рдХ рдирд┐рд░реНрдорд╛рдг рдЪрд░рдг рдЪрд▓рд╛рдЙрдБрдЫред рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЛрд▓рд╛рдИ рдмреЛрд▓рд╛рдпреМрдВ builder, рддрд░ рдЕрдиреНрддрд┐рдо FROM рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реЗрд░, рд╣рд╛рдореНрд░реЛ рдЕрдиреНрддрд┐рдо рдЫрд╡рд┐ рддрдпрд╛рд░ рд╣реБрдиреЗрдЫред рдЕрдиреНрддрд┐рдо рдЪрд░рдг nginx рдХреЛ рд╕рд╛рде рдЕрдиреНрддрд┐рдо рдЫрд╡рд┐рдорд╛ рдЕрдШрд┐рд▓реНрд▓реЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореНрд░реЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдХреЛ рдХрд▓рд╛рдХреГрддрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд╣реЛред рдЫрд╡рд┐рдХреЛ рдЖрдХрд╛рд░ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдШрдЯреЗрдХреЛ рдЫ:

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

рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐рдХреЛ рд╕рд╛рде рдХрдиреНрдЯреЗрдирд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рд╕рдмреИ рдХреБрд░рд╛рд▓реЗ рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:

docker run -p8080:80 app

-p8080:80 рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рд╣реЛрд╕реНрдЯ рдореЗрд╕рд┐рдирдорд╛ рдкреЛрд░реНрдЯ 8080 рд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░ рднрд┐рддреНрд░ 80 рдорд╛ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрдпреМрдВ рдЬрд╣рд╛рдБ nginx рдЪрд▓реНрдЫред рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдЦрд╛реЗрд▓реНрдиреБрд╣рд╛реЗрд╕реН http://localhost:8080/ рд░ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдЖрд╡реЗрджрди рджреЗрдЦреНрдЫреМрдВред рд╕рдмреИ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ!

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

рдЫрд╡рд┐рдХреЛ рд╕рд╛рдЗрдЬ 1.74 GB рдмрд╛рдЯ 36 MB рдорд╛ рдШрдЯрд╛рдЙрдиреБрд▓реЗ рддрдкрд╛рдИрдВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдЙрддреНрдкрд╛рджрдирдорд╛ рдбреЗрд▓рд┐рднрд░ рдЧрд░реНрди рд▓рд╛рдЧреНрдиреЗ рд╕рдордпрд▓рд╛рдИ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдШрдЯрд╛рдЙрдБрдЫред рддрд░ рд╕рднрд╛рдХреЛ рд╕рдордпрдорд╛ рдлрд░реНрдХреМрдВред

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

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

рддрд╣рд╣рд░реВрдХреЛ рдХреНрд░рдо рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрджреИ

рд╣рд╛рдореНрд░реЛ рдкрд╣рд┐рд▓реЛ рддреАрди рдЪрд░рдгрд╣рд░реВ рдХреНрдпрд╛рд╕ рдЧрд░рд┐рдпреЛ (рд╕рдВрдХреЗрдд Using cache)ред рдЪреМрдереЛ рдЪрд░рдгрдорд╛, рд╕рдмреИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реБрдиреНрдЫрдиреН рд░ рдкрд╛рдБрдЪреМрдВ рдЪрд░рдгрдорд╛ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рд╕реНрдерд╛рдкрд┐рдд рд╣реБрдиреНрдЫрдиреН RUN npm ci - 47.338 рдЬрддрд┐ред рдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рдкреБрди: рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рдзреЗрд░реИ рд╡рд┐рд░рд▓реИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫрдиреН? рддрд┐рдиреАрд╣рд░реВ рдХрд┐рди рдХреНрдпрд╛рд╕ рдЧрд░рд┐рдПрдирдиреН рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реНред рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ рдХрд┐ рдбрдХрд░рд▓реЗ рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдпрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рдХрд┐ рдХрдорд╛рдгреНрдб рд░ рдпрд╕рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХрд╛ рдЫрдиреН рдХрд┐ рднрдиреЗрд░ рд╣реЗрд░реНрдиред рдЪреМрдереЛ рдЪрд░рдгрдорд╛, рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХрд╛ рд╕рдмреИ рдлрд╛рдЗрд▓рд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдЫреМрдВ, рд░ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ, рдЕрд╡рд╢реНрдп рдкрдирд┐, рддреНрдпрд╣рд╛рдБ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рдбрдХрд░рд▓реЗ рдпреЛ рддрд╣рд▓рд╛рдИ рдХреНрдпрд╛рд╕рдмрд╛рдЯ рдорд╛рддреНрд░ рд▓рд┐рдБрджреИрди, рддрд░ рд╕рдмреИ рдкрдЫрд┐рд▓реНрд▓рд╛рд╣рд░реВ рдкрдирд┐! рдбрдХрд░рдлрд╛рдЗрд▓рдорд╛ рдХреЗрд╣реА рд╕рд╛рдирд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реМрдВред

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

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

рдкрд╣рд┐рд▓реЗ, package.json рд░ package-lock.json рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░рд┐рдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рд╣реБрдиреНрдЫрдиреН, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рддреНрд░ рд╕рдореНрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реБрдиреНрдЫред рдлрд▓рд╕реНрд╡рд░реВрдк:

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

real 0m46.497s
user 0m0.000s
sys 0m0.000s

46 рдорд┐рдиреЗрдЯрдХреЛ рд╕рдЯреНрдЯрд╛ 3 рд╕реЗрдХреЗрдиреНрдб - рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ! рддрд╣рд╣рд░реВрдХреЛ рд╕рд╣реА рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ: рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореА рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджреИрди, рддреНрдпрд╕рдкрдЫрд┐ рдХреЗ рд╡рд┐рд░рд▓реИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ, рд░ рдЕрдиреНрддрдорд╛ рдХреЗ рдкреНрд░рд╛рдпрдГ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдЫреМрдВред

рдЕрд░реНрдХреЛ, CI/CD рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдорд╛ рдЫрд╡рд┐рд╣рд░реВ рдЬрдореНрдорд╛ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреЗрд╣реА рд╢рдмреНрджрд╣рд░реВред

рдХреНрдпрд╛рд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдШрд┐рд▓реНрд▓реЛ рдЫрд╡рд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдирд┐рд░реНрдорд╛рдгрдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдиреИ рдкреНрд░рдХрд╛рд░рдХреЛ SaaS рд╕рдорд╛рдзрд╛рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рднрдиреЗ, рд╕реНрдерд╛рдиреАрдп рдбрдХрд░ рдХреНрдпрд╛рд╕ рд╕рдлрд╛ рд░ рддрд╛рдЬрд╛ рд╣реБрди рд╕рдХреНрдЫред рдбрдХрд░рд▓рд╛рдИ рдмреЗрдХреНрдб рд▓реЗрдпрд░рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдард╛рдЙрдБ рджрд┐рди, рдЙрд╕рд▓рд╛рдИ рдЕрдШрд┐рд▓реНрд▓реЛ рдирд┐рд░реНрдорд┐рдд рдЫрд╡рд┐ рджрд┐рдиреБрд╣реЛрд╕реНред

GitHub рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдиреБрд╣реЛрд╕реНред рд╣рд╛рдореА рдпреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ

on:
  push:
    branches:
      - master

name: Test docker build

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

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

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

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

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

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

рдЫрд╡рд┐ рдЬрдореНрдорд╛ рдЧрд░реА рджреБрдИ рдорд┐рдиреЗрдЯ рд░ реиреж рд╕реЗрдХреЗрдиреНрдбрдорд╛ 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 рд╕реЗрдХреЗрдиреНрдб рд╕рдореНрдо

рд╕рднрд╛рдХреЛ рдХреБрд▓ рд╕рдордп рдбреЗрдв рдорд┐рдиреЗрдЯрдорд╛ рдШрдЯрд╛рдЗрдпреЛред рдЕрдШрд┐рд▓реНрд▓реЛ рддрд╕реНрдмрд┐рд░рд╣рд░реВ рдЦрд┐рдЪреНрди рдЖрдзрд╛ рдорд┐рдиреЗрдЯ рдмрд┐рддреНрдпреЛред

рдкреНрд░рд┐рдореЗрдЬрд┐рдЩ

рд╕рдлрд╛ рдбрдХрд░ рдХреНрдпрд╛рд╕рдХреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдЕрд░реНрдХреЛ рддрд░рд┐рдХрд╛ рднрдиреЗрдХреЛ рдХреЗрд╣реА рддрд╣рд╣рд░реВрд▓рд╛рдИ рдЕрд░реНрдХреЛ рдбрдХрд░рдлрд╛рдЗрд▓рдорд╛ рд╕рд╛рд░реНрдиреБ, рдпрд╕рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБ, рдпрд╕рд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдкреБрд╢ рдЧрд░реНрдиреБ рд░ рдпрд╕рд▓рд╛рдИ рдЕрднрд┐рднрд╛рд╡рдХрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛред

рд╣рд╛рдореА Angular рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рдиреЛрдбрдЬ рдЫрд╡рд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛ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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди