НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

ΠŸΡ€Π΅Π΄ нСкоја Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π΄Π° Π²Π»Π΅Π·Π΅ Π²ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡ˜Π°, Π²ΠΎ ΠΎΠ²ΠΈΠ΅ Π΄Π΅Π½ΠΎΠ²ΠΈ Π½Π° слоТСни оркСстратори ΠΈ CI/CD, ΠΈΠΌΠ° Π΄ΠΎΠ»Π³ ΠΏΠ°Ρ‚ Π΄Π° сС ΠΏΠΎΠΌΠΈΠ½Π΅ ΠΎΠ΄ ΠΎΠ±Π²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π΄ΠΎ тСстови ΠΈ испорака. ΠŸΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ, ΠΌΠΎΠΆΠ΅Π²Ρ‚Π΅ Π΄Π° ΠΈΡΠΏΡ€Π°ΡœΠ°Ρ‚Π΅ Π½ΠΎΠ²ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΏΡ€Π΅ΠΊΡƒ FTP (никој повСќС Π½Π΅ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ°, Π½Π΅Π»ΠΈ?), Π° процСсот Π½Π° β€žΡ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅β€œ Ρ‚Ρ€Π°Π΅ΡˆΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ сСкунди. Π‘Π΅Π³Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΡΠΏΠΎΡ˜ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π΄Π° Ρ‡Π΅ΠΊΠ°Ρ‚Π΅ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π΄Π° стигнС Π΄ΠΎ корисницитС.

Π”Π΅Π» ΠΎΠ΄ ΠΎΠ²Π°Π° ΠΏΠ°Ρ‚Π΅ΠΊΠ° Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π±Π° Π½Π° слика Π½Π° Π”ΠΎΠΊΠ΅Ρ€. НСкогаш ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Ρ‚Ρ€Π°Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, нСкогаш дСсСтици ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, ΡˆΡ‚ΠΎ Ρ‚Π΅ΡˆΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ. Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, ќС Π·Π΅ΠΌΠ΅ΠΌΠ΅ Сдноставна Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° која ќС ја спакувамС Π²ΠΎ слика, ќС ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°ΠΌΠ΅ Π³Ρ€Π°Π΄Π΅ΡšΠ΅Ρ‚ΠΎ ΠΈ ќС Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΠΈΡ˜Π°Π½ΡΠΈΡ‚Π΅ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π°Ρ‚ ΠΎΠ²ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ.

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

ИмамС Π΄ΠΎΠ±Ρ€ΠΎ искуство Π²ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π½Π° мСдиумски Π²Π΅Π±-страници: ВАББ, Π‘Π΅Π», β€žΠΠΎΠ² Π²Π΅ΡΠ½ΠΈΠΊβ€œ, РСпублика… НС ΠΎΠ΄Π°ΠΌΠ½Π° Π³ΠΎ ΠΏΡ€ΠΎΡˆΠΈΡ€ΠΈΠ²ΠΌΠ΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΠΎΡ€Ρ‚Ρ„ΠΎΠ»ΠΈΠΎ со ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π²Π΅Π±-Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈ ΠŸΠΎΡ‚ΡΠ΅Ρ‚Π½ΠΈΠΊ. И Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π° Π±Ρ€Π·ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ ΠΈ старитС Π³Ρ€Π΅ΡˆΠΊΠΈ Π±Π΅Π° ΠΏΠΎΠΏΡ€Π°Π²Π΅Π½ΠΈ, Π±Π°Π²Π½ΠΎΡ‚ΠΎ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ стана Π³ΠΎΠ»Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π‘Π΅ распорСдувамС Π²ΠΎ GitLab. НиС собирамС слики, Π³ΠΈ Ρ‚ΡƒΡ€ΠΊΠ°ΠΌΠ΅ Π²ΠΎ GitLab Registry ΠΈ Π³ΠΈ прСнСсувамС Π²ΠΎ производство. ΠΠ°Ρ˜Π΄ΠΎΠ»Π³Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° ΠΎΠ²Π°Π° листа Π΅ ΡΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Π±Π΅Π· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, сСкоја ΠΈΠ·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π·Π°Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π» Ρ‚Ρ€Π°Π΅ΡˆΠ΅ 14 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ.

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

На ΠΊΡ€Π°Ρ˜ΠΎΡ‚, стана јасно Π΄Π΅ΠΊΠ° повСќС Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΆΠΈΠ²Π΅Π΅ΠΌΠ΅ Π²Π°ΠΊΠ° ΠΈ сСднавмС Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ Π·ΠΎΡˆΡ‚ΠΎ Ρ‚ΠΎΠ»ΠΊΡƒ Π΄ΠΎΠ»Π³ΠΎ сС собираат сликитС. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, успСавмС Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΠΌΠ΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ Π½Π° 30 сСкунди!

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

Π—Π° ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, Π·Π° Π΄Π° Π½Π΅ Π±ΠΈΠ΄Π΅ΠΌΠ΅ Π²Ρ€Π·Π°Π½ΠΈ Π·Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° Π½Π° Reminder, Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΡΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΏΡ€Π°Π·Π½Π° Angular Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Π—Π½Π°Ρ‡ΠΈ, ајдС Π΄Π° ја создадСмС Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°:

ng n app

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ PWA Π½Π° Π½Π΅Π³ΠΎ (Π½ΠΈΠ΅ смС прогрСсивни):

ng add @angular/pwa --project app

Π”ΠΎΠ΄Π΅ΠΊΠ° сС ΠΏΡ€Π΅Π·Π΅ΠΌΠ°Π°Ρ‚ ΠΌΠΈΠ»ΠΈΠΎΠ½ npm ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ајдС Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° сликата Π½Π° Π΄ΠΎΠΊΠ΅Ρ€. Docker ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° моТност Π·Π° ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π½ΠΈΠ²Π½ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π° срСдина Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΎΠ»Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ истоврСмСно Π½Π° Π΅Π΄Π΅Π½ сСрвСр. ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ сС ΠΌΠ½ΠΎΠ³Ρƒ полСсни ΠΎΠ΄ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈΡ‚Π΅ машини бидСјќи Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° систСмот. Π—Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ со Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, ΠΏΡ€Π²ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° создадСмС слика Π²ΠΎ која ќС спакувамС сè ΡˆΡ‚ΠΎ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Π’ΠΎ ΡΡƒΡˆΡ‚ΠΈΠ½Π°, сликата Π΅ копија Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π΅Π½ систСм. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π΅ΠΌΠ΅Ρ‚Π΅ Π³ΠΎ Dockerfile:

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

Dockerfile Π΅ Π·Π±ΠΈΡ€ Π½Π° инструкции; Π‘ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° сСкоја ΠΎΠ΄ Π½ΠΈΠ², Docker ќС Π³ΠΈ Π·Π°Ρ‡ΡƒΠ²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π½ΠΈΠΎΡ‚ систСм ΠΈ ќС Π³ΠΈ ΠΏΡ€Π΅ΠΊΠ»ΠΎΠΏΠΈ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅. БСкој Ρ‚ΠΈΠΌ создава свој слој. И Π·Π°Π²Ρ€ΡˆΠ΅Π½Π°Ρ‚Π° слика Π΅ слоСви ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π·Π°Π΅Π΄Π½ΠΎ.

Π¨Ρ‚ΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° сС Π·Π½Π°Π΅: сСкој Docker слој ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠ΅ΡˆΠΈΡ€Π°. Ако Π½ΠΈΡˆΡ‚ΠΎ Π½Π΅ сС смСнило ΠΎΠ΄ послСдното Π³Ρ€Π°Π΄Π΅ΡšΠ΅, Ρ‚ΠΎΠ³Π°Ρˆ намСсто Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°, Π΄ΠΎΠΊΠ΅Ρ€ΠΎΡ‚ ќС Π·Π΅ΠΌΠ΅ Π³ΠΎΡ‚ΠΎΠ² слој. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π³Π»Π°Π²Π½ΠΎΡ‚ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π°ΡšΠ΅ Π½Π° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ ќС сС Π΄ΠΎΠ»ΠΆΠΈ Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° ΠΊΠ΅ΡˆΠΎΡ‚, ΠΏΡ€ΠΈ ΠΌΠ΅Ρ€Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ ќС ΠΎΠ±Ρ€Π½Π΅ΠΌΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ слика со Π³ΠΎΡ‚ΠΎΠ² кСш. Π—Π½Π°Ρ‡ΠΈ, Ρ‡Π΅ΠΊΠΎΡ€ ΠΏΠΎ Ρ‡Π΅ΠΊΠΎΡ€:

  1. НиС Π³ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΠΌΠ΅ сликитС Π»ΠΎΠΊΠ°Π»Π½ΠΎ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π²Π»ΠΈΡ˜Π°Π°Ρ‚ Π½Π° тСстот.
    docker rmi $(docker images -q)
  2. Ја лансирамС ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° Π·Π° ΠΏΡ€Π² ΠΏΠ°Ρ‚.
    time docker build -t app .
  3. Ја ΠΌΠ΅Π½ΡƒΠ²Π°ΠΌΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° src/index.html - ја ΠΈΠΌΠΈΡ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€.
  4. Π˜Π·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° ја Π²ΠΎΠ΄ΠΈΠΌΠ΅ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ ΠΏΠ°Ρ‚.
    time docker build -t app .

Ако ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ слики Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π° (повСќС Π·Π° Ρ‚ΠΎΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρƒ), Ρ‚ΠΎΠ³Π°Ρˆ ΠΊΠΎΠ³Π° ќС Π·Π°ΠΏΠΎΡ‡Π½Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π°, Docker вСќС ќС ΠΈΠΌΠ° ΠΊΡƒΠΏ кСшови Π½Π° ΠΎΠ΄Π±ΠΎΡ€ΠΎΡ‚. Наша Π·Π°Π΄Π°Ρ‡Π° Π΅ Π΄Π° Π½Π°ΡƒΡ‡ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ користимС ΠΊΠ΅ΡˆΠΎΡ‚, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° ќС ΠΎΠ΄ΠΈ ΡˆΡ‚ΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ±Ρ€Π·ΠΎ. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ прСтпоставувамС Π΄Π΅ΠΊΠ° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° Π±Π΅Π· кСш сС случува само Сднаш - ΠΏΡ€Π²ΠΈΠΎΡ‚ ΠΏΠ°Ρ‚ - Π·Π°Ρ‚ΠΎΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ»ΠΊΡƒ Π±Π°Π²Π½ΠΎ бСшС Ρ‚ΠΎΡ˜ ΠΏΡ€Π² ΠΏΠ°Ρ‚. Π’ΠΎ тСстовитС, Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ возСњС Π½Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° Π½ΠΈ Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π° ΠΊΠ΅ΡˆΠΎΠ²ΠΈΡ‚Π΅ сС вСќС Π·Π°Π³Ρ€Π΅Π°Π½ΠΈ ΠΈ Π½ΠΈΠ΅ смС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π΄Π° ја испСчСмС Π½Π°ΡˆΠ°Ρ‚Π° Ρ‚ΠΎΡ€Ρ‚Π°. Π‘Π΅ΠΏΠ°ΠΊ, Π½Π΅ΠΊΠΎΠΈ совСти ќС Π²Π»ΠΈΡ˜Π°Π°Ρ‚ ΠΈ Π½Π° ΠΏΡ€Π²Π°Ρ‚Π° ΠΈΠ·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

АјдС Π΄Π° ја ставимС Dockerfile ΠΎΠΏΠΈΡˆΠ°Π½Π°Ρ‚Π° ΠΏΠΎΠ³ΠΎΡ€Π΅ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ΠΈ Π΄Π° ја Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π°. Π‘ΠΈΡ‚Π΅ огласи сС ΠΊΠΎΠ½Π΄Π΅Π½Π·ΠΈΡ€Π°Π½ΠΈ Π·Π° полСсно Ρ‡ΠΈΡ‚Π°ΡšΠ΅.

$ 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

ΠŸΡ€Π΅Π΄ ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π°, docker Π³ΠΈ Π·Π΅ΠΌΠ° ситС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ контСкст ΠΈ Π³ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ° Π΄ΠΎ ΡΠ²ΠΎΡ˜ΠΎΡ‚ Π΄Π΅ΠΌΠΎΠ½ Sending build context to Docker daemon 409MB. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ΠΎΡ‚ Π·Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π° Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ ΠΊΠ°ΠΊΠΎ послСдСн Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅. Π’ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜, ΠΎΠ²Π° Π΅ Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ - β€ž.β€œ, - ΠΈ Docker Π²Π»Π΅Ρ‡Π΅ сè ΡˆΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π²ΠΎ ΠΎΠ²Π°Π° ΠΏΠ°ΠΏΠΊΠ°. 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 Π²ΠΎ Dockerfile. Π’ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜, Π½ΠΈΠ΅ користимС слика Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Ubuntu која вСќС ΠΈΠΌΠ° инсталирано nodejs. И Ρ‚Π΅ΠΆΠΈ...

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

... рСчиси Π³ΠΈΠ³Π°Π±Π°Ρ˜Ρ‚. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° ја Π½Π°ΠΌΠ°Π»ΠΈΡ‚Π΅ Ρ˜Π°Ρ‡ΠΈΠ½Π°Ρ‚Π° Π½Π° Π·Π²ΡƒΠΊΠΎΡ‚ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° слика Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Alpine Linux. Alpine Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ°Π» Linux. Π‘Π»ΠΈΠΊΠ°Ρ‚Π° Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ Π·Π° nodej Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° алпски Ρ‚Π΅ΠΆΠΈ само 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

ΠœΠΎΡ€Π°Π²ΠΌΠ΅ Π΄Π° инсталирамС Π½Π΅ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠΎΠΈ сС Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΈ Π·Π° Π΄Π° сС ΠΈΠ·Π³Ρ€Π°Π΄ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π”Π°, Angular Π½Π΅ сС Π³Ρ€Π°Π΄ΠΈ Π±Π΅Π· Python Β―(Β°_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 сСрвСр Π½Π° nodejs. Но, ќС Π³ΠΎ олСснимС. ΠŸΠΎΠ³ΠΎΠ΄Π΅Ρ‚Π΅ руски Π·Π±ΠΎΡ€ ΡˆΡ‚ΠΎ ΠΈΠΌΠ° Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±ΡƒΠΊΠ²ΠΈ β€ž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, Π½ΠΎ ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΎΠ΄ послСдниот ΠžΠ”, ќС сС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈ Π½Π°ΡˆΠ°Ρ‚Π° ΠΊΠΎΠ½Π΅Ρ‡Π½Π° слика. ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΠΎΡ‚ Ρ‡Π΅ΠΊΠΎΡ€ Π΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ собраниС Π²ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΠΎΡ‚ Ρ‡Π΅ΠΊΠΎΡ€ Π²ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° слика со 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/ ΠΈ ја Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Π‘Γ¨ Ρ€Π°Π±ΠΎΡ‚ΠΈ!

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 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 с. Π—ΠΎΡˆΡ‚ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° Π³ΠΈ инсталиратС зависноститС сСкој ΠΏΠ°Ρ‚ Π°ΠΊΠΎ Ρ‚ΠΈΠ΅ сС ΠΌΠ΅Π½ΡƒΠ²Π°Π°Ρ‚ ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π΅Ρ‚ΠΊΠΎ? АјдС Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌΠ΅ Π·ΠΎΡˆΡ‚ΠΎ Ρ‚ΠΈΠ΅ Π½Π΅ Π±Π΅Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ. ΠŸΠΎΠ΅Π½Ρ‚Π°Ρ‚Π° Π΅ Π΄Π΅ΠΊΠ° Docker ќС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° слој ΠΏΠΎ слој Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈ Π΄Π°Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со Π½Π΅Π° сС смСнСти. На Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΈΠΎΡ‚ Ρ‡Π΅ΠΊΠΎΡ€, Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ ситС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° ΠΌΠ΅Ρ“Ρƒ Π½ΠΈΠ², сС Ρ€Π°Π·Π±ΠΈΡ€Π°, ΠΈΠΌΠ° ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Docker Π½Π΅ само ΡˆΡ‚ΠΎ Π½Π΅ Π³ΠΎ Π·Π΅ΠΌΠ° овој слој ΠΎΠ΄ ΠΊΠ΅ΡˆΠΎΡ‚, Ρ‚ΡƒΠΊΡƒ ΠΈ ситС Π½Π°Ρ€Π΅Π΄Π½ΠΈ! АјдС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΠΈ ΠΌΠ°Π»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ 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 Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π°, Ρ‚ΠΎΠ³Π°Ρˆ Π»ΠΎΠΊΠ°Π»Π½ΠΈΠΎΡ‚ кСш Π½Π° Docker ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ чист ΠΈ свСТ. Π—Π° Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅Ρ‚Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ΠΎΡ‚ мСсто Π΄Π° Π³ΠΈ Π΄ΠΎΠ±ΠΈΠ΅ ΠΏΠ΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ слоСви, Π΄Π°Ρ˜Ρ‚Π΅ ΠΌΡƒ ја ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° слика.

Π”Π° Π·Π΅ΠΌΠ΅ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ 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

Π‘Π»ΠΈΠΊΠ°Ρ‚Π° сС составува ΠΈ сС Ρ‚ΡƒΡ€ΠΊΠ° Π²ΠΎ GitHub Packages Π·Π° Π΄Π²Π΅ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΈ 20 сСкунди:

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 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. Π€Π°ΠΊΡ‚ Π΅ Π΄Π΅ΠΊΠ° Π²ΠΎ ΠΏΠΎΠ²Π΅ΡœΠ΅ΡΡ‚Π΅ΠΏΠ΅Π½ΠΎΡ‚ΠΎ ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅, Π΄ΠΎΠ±ΠΈΠ΅Π½Π°Ρ‚Π° слика ќС Π±ΠΈΠ΄Π΅ Π·Π±ΠΈΡ€ Π½Π° слоСви ΠΎΠ΄ послСдната Ρ„Π°Π·Π°. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, слоСвитС ΠΎΠ΄ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ слоСви Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ Π²ΠΊΠ»ΡƒΡ‡Π΅Π½ΠΈ Π²ΠΎ сликата. Π—Π°Ρ‚ΠΎΠ°, ΠΊΠΎΠ³Π° сС користи ΠΊΠΎΠ½Π΅Ρ‡Π½Π°Ρ‚Π° слика ΠΎΠ΄ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π°, Docker Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° најдС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ слоСви Π·Π° Π΄Π° ја ΠΈΠ·Π³Ρ€Π°Π΄ΠΈ сликата со nodejs (Π³Ρ€Π°Π΄ΠΈΡ‚Π΅Π» Ρ„Π°Π·Π°). Π—Π° Π΄Π° сС Ρ€Π΅ΡˆΠΈ овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, сС ΠΊΡ€Π΅ΠΈΡ€Π° срСдна слика $IMAGE_NAME-builder-stage ΠΈ сС Ρ‚ΡƒΡ€ΠΊΠ° Π΄ΠΎ GitHub Packages Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π²ΠΎ послСдоватСлна Π²Π΅Ρ€Π·ΠΈΡ˜Π° ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π²ΠΎΡ€ Π½Π° кСш.

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

Π’ΠΊΡƒΠΏΠ½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅ бСшС Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ Π½Π° Π΅Π΄Π½Π° ΠΈ ΠΏΠΎΠ» ΠΌΠΈΠ½ΡƒΡ‚Π°. ΠŸΠΎΡ‚Ρ€ΠΎΡˆΠ΅Π½Π° Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΌΠΈΠ½ΡƒΡ‚Π° Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ слики.

ΠŸΡ€Π΅ΡΠ»ΠΈΠΊΠΈ

Π”Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС Ρ€Π΅ΡˆΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со чистата кСш Π½Π° Docker Π΅ Π΄Π° сС прСмСстат Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ слоСвитС Π²ΠΎ Π΄Ρ€ΡƒΠ³Π° Dockerfile, Π΄Π° сС ΠΈΠ·Π³Ρ€Π°Π΄ΠΈ посСбно, Π΄Π° сС Ρ‚ΡƒΡ€ΠΊΠ° Π²ΠΎ ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΡΠΊΠΈΠΎΡ‚ рСгистар ΠΈ Π΄Π° сС користи ΠΊΠ°ΠΊΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π».

НиС создавамС сопствСна слика nodejs Π·Π° Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌΠ΅ Angular Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. НаправСтС Dockerfile.node Π²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚

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

Π‘ΠΎΠ±ΠΈΡ€Π°ΠΌΠ΅ ΠΈ Ρ‚ΡƒΡ€ΠΊΠ°ΠΌΠ΅ јавна слика Π²ΠΎ Docker Hub:

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
...

Π’ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ Π½Π΅ сС Π½Π°ΠΌΠ°Π»ΠΈ, Π½ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΈΡ‚Π΅ слики ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ корисни Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ инсталиратС иститС зависности Π²ΠΎ сСкој ΠΎΠ΄ Π½ΠΈΠ².

НСколку совСти Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Docker слики. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎ 30 сСкунди

Π Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π·Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ слики. Ако сакатС Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π΄Π° ΠΎΠ΄ΠΈ Π±Ρ€Π·ΠΎ, ΠΎΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС Π΄Π° Π³ΠΎ користитС ΠΎΠ²Π° Π²ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

  • Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΡšΠ΅ Π½Π° контСкстот;
  • ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° ΠΌΠ°Π»ΠΈ родитСлски слики;
  • ΠΏΠΎΠ²Π΅ΡœΠ΅ΡΡ‚Π΅ΠΏΠ΅Π½ΠΎ ΡΠΊΠ»ΠΎΠΏΡƒΠ²Π°ΡšΠ΅;
  • ΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° рСдослСдот Π½Π° инструкциитС Π²ΠΎ Dockerfile Π·Π° Сфикасно ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΊΠ΅ΡˆΠΎΡ‚;
  • ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ кСш Π²ΠΎ CI/CD систСми;
  • ΠΏΡ€Π΅Π»ΠΈΠΌΠΈΠ½Π°Ρ€Π½ΠΎ создавањС Π½Π° слики.

Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ ќС Π²ΠΈ Π΄Π°Π΄Π΅ појасно ΠΊΠ°ΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ Docker ΠΈ ќС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π²Π°ΡˆΠ΅Ρ‚ΠΎ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅. Π—Π° Π΄Π° си ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚Π΅ со ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π°, создадСно Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ https://github.com/devopsprodigy/test-docker-build.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€