Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 30 сСкунди.

ΠŸΡ€Π΅Π΄ΠΈ функцията Π΄Π° стигнС Π΄ΠΎ продукция, Π² Π½Π°ΡˆΠ΅Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° слоТни оркСстратори ΠΈ CI/CD, тя трябва Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ дълъг ΠΏΡŠΡ‚ ΠΎΡ‚ ΠΊΠΎΠΌΠΈΡ‚ Π΄ΠΎ тСстовС ΠΈ доставка. ΠŸΡ€Π΅Π΄ΠΈ моТСшС Π΄Π° ΠΊΠ°Ρ‡ΠΈΡˆ Π½ΠΎΠ²ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ FTP (Π° Ρ‚Π°ΠΊΠ° Π²Π΅Ρ‡Π΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΏΡ€Π°Π²ΠΈ, Π½Π°Π»ΠΈ?), ΠΈ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° "Π΄Π΅ΠΏΠ»ΠΎΠΉ" ΠΎΡ‚Π½Π΅ΠΌΠ°ΡˆΠ΅ сСкунди. Π‘Π΅Π³Π° трябва Π΄Π° създадСш merge request ΠΈ Π΄Π° Ρ‡Π°ΠΊΠ°Ρˆ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ функцията стигнС Π΄ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅.

Част ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ процСс Π΅ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·Π°. Понякога ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚Π½Π΅ΠΌΠ° ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, Π° понякога β€” дСсСтки ΠΌΠΈΠ½ΡƒΡ‚ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ просто ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΠΎΠΏΠ°ΠΊΡƒΠ΅ΠΌ Π² ΠΎΠ±Ρ€Π°Π·, Ρ‰Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ няколко ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° ускоряванС Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ ΠΈ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡŽΠ°Π½ΡΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Ρ‚Π΅Π·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ.

Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 30 сСкунди.

ИмамС Π΄ΠΎΠ±ΡŠΡ€ ΠΎΠΏΠΈΡ‚ Π² ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° сайтовС Π·Π° ΠΌΠ΅Π΄ΠΈΠΈ: ВАББ, The Bell, "Нова Π³Π°Π·Π΅Ρ‚Π°", Republic… БъвсСм скоро ΠΏΠΎΠΏΡŠΠ»Π½ΠΈΡ…ΠΌΠ΅ ΠΏΠΎΡ€Ρ‚Ρ„ΠΎΠ»ΠΈΠΎΡ‚ΠΎ си, пускайки Π² продукция сайт Reminder. И Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π±ΡŠΡ€Π·ΠΎ Π΄ΠΎΠΈΠ·ΠΏΠΈΠΏΠ²Π°Ρ…ΠΌΠ΅ Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ поправяхмС стари бъговС, бавният Π΄Π΅ΠΏΠ»ΠΎΠΉ сС ΠΎΠΊΠ°Π·Π° голям ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π”Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π° GitLab. Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°ΠΌΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΈ, пускамС Π² GitLab Registry ΠΈ разпрСдСлямС Π½Π° продукцията. Π’ Ρ‚ΠΎΠ·ΠΈ процСс Π½Π°ΠΉ-Π΄ΡŠΠ»Π³ΠΎΡ‚ΠΎ Π΅ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр: Π±Π΅Π· оптимизация всяко ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° ΠΎΡ‚Π½Π΅ΠΌΠ°ΡˆΠ΅ 14 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ.

Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 30 сСкунди.

Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка стана ясно, Ρ‡Π΅ Ρ‚Π°ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°, ΠΈ сС Π·Π°Π΅Ρ…ΠΌΠ΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π·Π°Ρ‰ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚Π΅ сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Ρ‚ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° дълго. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка успяхмС Π΄Π° ΡΡŠΠΊΡ€Π°Ρ‚ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π΄ΠΎ 30 сСкунди!

Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 30 сСкунди.

Π—Π° Ρ‚Π°Π·ΠΈ статия, Π·Π° Π΄Π° Π½Π΅ сС ΠΏΡ€ΠΈΠ²ΡŠΡ€Π·Π²Π°ΠΌΠ΅ към срСдата Π½Π° Reminder, Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€Π°Π·Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Angular. И Ρ‚Π°ΠΊΠ°, създавамС Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

ng n app

ДобавямС Π² Π½Π΅Π³ΠΎ PWA (Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка, Π½ΠΈΠ΅ смС прогрСсивни):

ng add @angular/pwa --project app

Π”ΠΎΠΊΠ°Ρ‚ΠΎ сС изтСглят ΠΌΠΈΠ»ΠΈΠΎΠ½ npm ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π½Π΅ΠΊΠ° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΊ Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½ docker-ΠΎΠ±Ρ€Π°Π·ΡŠΡ‚. 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 .
Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π½Π° Π±ΠΈΠ»Π΄ Π΄ΠΎ Docker Π΄Π΅ΠΌΠΎΠ½ 409MB
Π‘Ρ‚ΡŠΠΏΠΊΠ° 1/5 : FROM node:12.16.2
Бтатус: Π˜Π·Ρ‚Π΅Π³Π»Π΅Π½Π° ΠΏΠΎ-Π½ΠΎΠ²Π° вСрсия Π½Π° ΠΎΠ±Ρ€Π°Π·Π° Π·Π° node:12.16.2
Π‘Ρ‚ΡŠΠΏΠΊΠ° 2/5 : WORKDIR /app
Π‘Ρ‚ΡŠΠΏΠΊΠ° 3/5 : COPY . .
Π‘Ρ‚ΡŠΠΏΠΊΠ° 4/5 : RUN npm ci
Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ 1357 ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π·Π° 22.47s
Π‘Ρ‚ΡŠΠΏΠΊΠ° 5/5 : RUN npm run build --prod
Π”Π°Ρ‚Π°: 2020-04-16T19:20:09.664Z - Π₯аш: fffa0fddaa3425c55dd3 - Π’Ρ€Π΅ΠΌΠ΅: 37581ms
УспСшно построСн c8c279335f46
УспСшно Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΎ app:latest

Ρ€Π΅Π°Π»Π½ΠΎ 5m4.541s
ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» 0m0.000s
систСма 0m0.000s

ΠŸΡ€ΠΎΠΌΠ΅Π½ΡΠΌΠ΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° src/index.html ΠΈ стартирамС Π·Π° Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΡŠΡ‚.

$ time docker build -t app .
Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π½Π° Π±ΠΈΠ»Π΄ Π΄ΠΎ Docker Π΄Π΅ΠΌΠΎΠ½ 409MB
Π‘Ρ‚ΡŠΠΏΠΊΠ° 1/5 : FROM node:12.16.2
Π‘Ρ‚ΡŠΠΏΠΊΠ° 2/5 : WORKDIR /app
 ---> ИзползванС на кСш
Π‘Ρ‚ΡŠΠΏΠΊΠ° 3/5 : COPY . .
Π‘Ρ‚ΡŠΠΏΠΊΠ° 4/5 : RUN npm ci
Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ 1357 ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π·Π° 22.47s
Π‘Ρ‚ΡŠΠΏΠΊΠ° 5/5 : RUN npm run build --prod
Π”Π°Ρ‚Π°: 2020-04-16T19:26:26.587Z - Π₯аш: fffa0fddaa3425c55dd3 - Π’Ρ€Π΅ΠΌΠ΅: 37902ms
УспСшно построСн 79f335df92d3
УспСшно Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΎ app:latest

Ρ€Π΅Π°Π»Π½ΠΎ 3m33.262s
ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» 0m0.000s
систСма 0m0.000s

Π—Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΠΎΠ±Ρ€Π°Π·ΡŠΡ‚ Π½ΠΈ Π΅ ΡƒΡΠΏΠ΅ΡˆΠ΅Π½, изпълнявамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° docker images:

REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
app          latest   79f335df92d3   ΠŸΡ€Π΅Π΄ΠΈ ΠΎΠΊΠΎΠ»ΠΎ ΠΌΠΈΠ½ΡƒΡ‚Π°   1.74GB

ΠŸΡ€Π΅Π΄ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Docker Π²Π·ΠΈΠΌΠ° всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ тСкущия контСкст ΠΈ Π³ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Π½Π° своя Π΄Π΅ΠΌΠΎΠ½. Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Docker Π΄Π΅ΠΌΠΎΠ½Π° 409MB. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ΡŠΡ‚ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ сС посочва ΠΊΠ°Ρ‚ΠΎ послСдСн Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° build. Π’ нашия случай Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° дирСктория β€” Β«.Β», ΠΈ Docker изтСгля всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π² Ρ‚Π°Π·ΠΈ ΠΏΠ°ΠΏΠΊΠ°. 409 MB Π΅ ΠΌΠ½ΠΎΠ³ΠΎ; Π½Π΅ΠΊΠ° помислим ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΠΌ.

НамаляванС Π½Π° контСкста

Π—Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ контСкста, ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°. Или Π΄Π° слоТим всички Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅, Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° ΠΏΠ°ΠΏΠΊΠ° ΠΈ Π΄Π° посочим контСкста Π½Π° Docker ΠΈΠΌΠ΅Π½Π½ΠΎ към Ρ‚ΠΎΠ·ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π’ΠΎΠ²Π° Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π·Π°Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° посочим ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: ΠΊΠ°ΠΊΠ²ΠΎ Π½Π΅ трябва Π΄Π° сС Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π² контСкста. Π—Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„Π°ΠΉΠ» .dockerignore Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ‰Π΅ посочим, ΠΊΠ°ΠΊΠ²ΠΎ Π½Π΅ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅:

.git
/node_modules

ΠΈ Ρ‰Π΅ стартирамС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΠ²ΠΎ:

$ time docker build -t app .
Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Docker Π΄Π΅ΠΌΠΎΠ½Π° 607.2kB
Π‘Ρ‚ΡŠΠΏΠΊΠ° 1/5 : FROM node:12.16.2
Π‘Ρ‚ΡŠΠΏΠΊΠ° 2/5 : WORKDIR /app
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 3/5 : COPY . .
Π‘Ρ‚ΡŠΠΏΠΊΠ° 4/5 : RUN npm ci
Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ 1357 ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π·Π° 22.47s
Π‘Ρ‚ΡŠΠΏΠΊΠ° 5/5 : RUN npm run build --prod
Π”Π°Ρ‚Π°: 2020-04-16T19:33:54.338Z - Π₯Сш: fffa0fddaa3425c55dd3 - Π’Ρ€Π΅ΠΌΠ΅: 37313ms
УспСшно построСн 4942f010792a
УспСшно Ρ‚Π°Π³Π½Π°Ρ‚ app:latest

Ρ€Π΅Π°Π»Π½ΠΎ 1m47.763s
ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» 0m0.000s
систСма 0m0.000s

607.2 ΠšΠ±Π°ΠΉΡ‚Π° β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΎΡ‚ 409 MB. ОсвСн Ρ‚ΠΎΠ²Π° смС Π½Π°ΠΌΠ°Π»ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΎΠ±Ρ€Π°Π·Π° ΠΎΡ‚ 1.74 Π΄ΠΎ 1.38 Π“Π±Π°ΠΉΡ‚Π°:

Π Π•ΠŸΠžΠ—Π˜Π’ΠžΠ Π˜Π™   ВАГ      ID НА ΠžΠ‘Π ΠΠ—Π       Π‘ΠͺЗДАДЕН         Π ΠΠ—ΠœΠ•Π 
app          latest   4942f010792a   ΠΏΡ€Π΅Π΄ΠΈ 3 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ   1.38GB

НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΎΠ±Ρ€Π°Π·Π° ΠΎΡ‰Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅.

ИзползванС на Alpine

Π”Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π·Π° намаляванС Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΠΎΠ±Ρ€Π°Π·Π° Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° малък родитСлски ΠΎΠ±Ρ€Π°Π·. РодитСлският ΠΎΠ±Ρ€Π°Π· Π΅ ΠΎΠ±Ρ€Π°Π·ΡŠΡ‚, Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ сС строи Π½Π°ΡˆΠΈΡΡ‚ ΠΎΠ±Ρ€Π°Π·. Долният слой сС посочва с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° OT Π² Dockerfile. Π’ нашия случай ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠ±Ρ€Π°Π·, основаващ сС Π½Π° Ubuntu, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π΅ инсталиран nodejs. И Ρ‚ΠΎΠΉ Ρ‚Π΅ΠΆΠΈ …

$ docker images -a | grep node
node 12.16.2 406aa3abbc6c ΠΏΡ€Π΅Π΄ΠΈ 17 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ 916MB

… ΠΏΠΎΡ‡Ρ‚ΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚. Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ ΠΎΠ±Π΅ΠΌΡŠΡ‚, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±Ρ€Π°Π·, основан Π½Π° Alpine Linux. Alpine Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ малък Linux. Docker-ΠΎΠ±Ρ€Π°Π· Π·Π° nodejs, основан Π½Π° alpine, Ρ‚Π΅ΠΆΠΈ само 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:

Π Π•ΠŸΠžΠ—Π˜Π’ΠžΠ Π˜Π™   ВАГ      ID НА ΠžΠ‘Π ΠΠ—Π       Π‘ΠͺЗДАДЕН          Π ΠΠ—ΠœΠ•Π 
app          latest   aa031edc315a   ΠΏΡ€Π΅Π΄ΠΈ 22 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ   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. Но Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Ρ‰Π°Ρ‚Π° ΠΏΠΎ-просто. ΠŸΠΎΠ·Π½Π°ΠΉΡ‚Π΅ руската Π΄ΡƒΠΌΠ°, Π² която ΠΈΠΌΠ° Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π±ΡƒΠΊΠ²ΠΈ β€žΡ‹β€œ. ΠŸΡ€Π°Π²ΠΈΠ»Π½ΠΎ! ЫнТыныксы. Π’Π·Π΅ΠΌΠ°ΠΌΠ΅ ΠΎΠ±Ρ€Π°Π· с nginx, слагамС Π² Π½Π΅Π³ΠΎ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° dist ΠΈ малък ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ Ρ„Π°ΠΉΠ»:

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

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

Π’ΠΎΠ²Π° всичко Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ multi-stage build. Π©Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ нашия 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 .

Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ инструкции OT Π² 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/ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ!

Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 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.338s. Π—Π°Ρ‰ΠΎ Π΄Π° инсталирамС зависимоститС ΠΎΡ‚Π½ΠΎΠ²ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚Π΅ рядко сС промСнят? НСка Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π·Π°Ρ‰ΠΎ Ρ‚Π΅ Π½Π΅ бяха ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ. Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ 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 .
Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° контСкста Π½Π° строСТа Π½Π° Docker Π΄Π°Π΅ΠΌΠΎΠ½Π° 608.8kB
Π‘Ρ‚ΡŠΠΏΠΊΠ° 1/12 : FROM node:12.16.2-alpine3.11 as builder
Π‘Ρ‚ΡŠΠΏΠΊΠ° 2/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 3/12 : WORKDIR /app
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 4/12 : COPY package*.json ./
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 5/12 : RUN npm ci
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 6/12 : COPY . .
Π‘Ρ‚ΡŠΠΏΠΊΠ° 7/12 : RUN npm run build --prod
Π”Π°Ρ‚Π°: 2020-04-16T21:29:44.770Z - Π₯Сш: fffa0fddaa3425c55dd3 - Π’Ρ€Π΅ΠΌΠ΅: 38287ms
 ---> 1b9448c73558
Π‘Ρ‚ΡŠΠΏΠΊΠ° 8/12 : FROM nginx:stable-alpine
Π‘Ρ‚ΡŠΠΏΠΊΠ° 9/12 : WORKDIR /app
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 10/12 : RUN rm /etc/nginx/conf.d/default.conf
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 11/12 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> ИзползванС на кСша
Π‘Ρ‚ΡŠΠΏΠΊΠ° 12/12 : COPY --from=builder /app/dist/app .
УспСшно построСн a44dd7c217c3
УспСшно ΠΎΠ·Π½Π°Ρ‡Π΅Π½ app:latest

Ρ€Π΅Π°Π»Π½ΠΎ 0m46.497s
ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» 0m0.000s
систСма 0m0.000s

46 сСкунди вмСсто 3 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅! Π’Π°ΠΆΠ΅Π½ Π΅ правилния Ρ€Π΅Π΄ Π½Π° слоСвСтС: ΠΏΡŠΡ€Π²ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ ΠΎΠ½ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ сС промСня, слСд Ρ‚ΠΎΠ²Π° ΠΎΠ½ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ рядко сС промСня, Π° накрая β€” ΠΎΠ½ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ сС промСня чСсто.

Π‘Π»Π΅Π΄Π²Π° ΠΌΠ°Π»ΠΊΠΎ информация Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΈ Π² CI/CD систСми.

ИзползванС Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΈ Π·Π° кСш

Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ SaaS Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅, локалният кСш Π½Π° Docker ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС чист ΠΈ Π½Π΅ΠΎΠΏΠ΅Ρ‚Π½Π΅Π½. Π—Π° Π΄Π° ΠΈΠΌΠ° ΠΎΡ‚ΠΊΡŠΠ΄Π΅ 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 (Π΅Ρ‚Π°ΠΏ builder). Π—Π° Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, сС създава ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ ΠΎΠ±Ρ€Π°Π· $IMAGE_NAME-builder-stage ΠΈ сС ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° Π² GitHub Packages, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² слСдващото ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° кСш.

Няколко ΡΡŠΠ²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π΄Π° ускоритС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Docker ΠΎΠ±Ρ€Π°Π·ΠΈ. НапримСр, Π΄ΠΎ 30 сСкунди.

ΠžΠ±Ρ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π΅ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ Π½Π° 1,5 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ. Половин ΠΌΠΈΠ½ΡƒΡ‚Π° сС ΠΈΠ·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π° Π·Π° изтСглянС Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π·ΠΈ.

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΈ

Π”Ρ€ΡƒΠ³ Π½Π°Ρ‡ΠΈΠ½ Π·Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с чистия кСш Π½Π° Docker Π΅ Π΄Π° изнСсСм част ΠΎΡ‚ слоСвСтС Π² Π΄Ρ€ΡƒΠ³ Dockerfile, Π΄Π° Π³ΠΎ ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ, Π΄Π° Π³ΠΎ ΠΊΠ°Ρ‡ΠΈΠΌ Π² Container Registry ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠ°Ρ‚ΠΎ родитСлски.

БъздавамС свой ΠΎΠ±Ρ€Π°Π· Π½Π° 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 сСкунди.

Π Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ няколко ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π° ускоряванС Π½Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° docker ΠΎΠ±Ρ€Π°Π·ΠΈ. Ако искатС Π΄Π° Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°Ρ‚Π΅ Π±ΡŠΡ€Π·ΠΎ, ΠΎΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° си:

  • намаляванС Π½Π° контСкста;
  • ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ°Π»ΠΊΠΈ родитСлски ΠΎΠ±Ρ€Π°Π·ΠΈ;
  • мултистСйдТ сглобяванС;
  • смяна Π½Π° Ρ€Π΅Π΄Π° Π½Π° инструкциитС Π² Dockerfile, Π·Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° кСша Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ;
  • настройка Π½Π° кСша Π² CI/CD систСмитС;
  • ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ създаванС Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΈ.

Надявам сС, Ρ‡Π΅ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‰Π΅ станС ΠΏΠΎ-ясно ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ Docker ΠΈ Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° настроитС своя Π΄Π΅ΠΏΠ»ΠΎΠΉ. Π—Π° Π΄Π° СкспСримСнтиратС с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΎΡ‚ статията, Π΅ създадСн Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. https://github.com/devopsprodigy/test-docker-build.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster