ΠΡΠ΅Π΄ Π½Π΅ΠΊΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° Π΄Π° Π²Π»Π΅Π·Π΅ Π²ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ°, Π²ΠΎ ΠΎΠ²ΠΈΠ΅ Π΄Π΅Π½ΠΎΠ²ΠΈ Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΈ ΠΈ CI/CD, ΠΈΠΌΠ° Π΄ΠΎΠ»Π³ ΠΏΠ°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠΈΠ½Π΅ ΠΎΠ΄ ΠΎΠ±Π²ΡΠ·ΡΠ²Π°ΡΠ΅ Π΄ΠΎ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΈ ΠΈΡΠΏΠΎΡΠ°ΠΊΠ°. ΠΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ, ΠΌΠΎΠΆΠ΅Π²ΡΠ΅ Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ Π½ΠΎΠ²ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΏΡΠ΅ΠΊΡ FTP (Π½ΠΈΠΊΠΎΡ ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ°, Π½Π΅Π»ΠΈ?), Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° βΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅β ΡΡΠ°Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π‘Π΅Π³Π° ΡΡΠ΅Π±Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π±Π°ΡΠ°ΡΠ΅ Π·Π° ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ΠΊΠ°ΡΠ΅ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π΄Π° ΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅.
ΠΠ΅Π» ΠΎΠ΄ ΠΎΠ²Π°Π° ΠΏΠ°ΡΠ΅ΠΊΠ° Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π±Π° Π½Π° ΡΠ»ΠΈΠΊΠ° Π½Π° ΠΠΎΠΊΠ΅Ρ. ΠΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ΡΠΎ ΡΡΠ°Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠΈΠ½ΡΡΠΈ, Π½Π΅ΠΊΠΎΠ³Π°Ρ Π΄Π΅ΡΠ΅ΡΠΈΡΠΈ ΠΌΠΈΠ½ΡΡΠΈ, ΡΡΠΎ ΡΠ΅ΡΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ. ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°, ΡΠ΅ Π·Π΅ΠΌΠ΅ΠΌΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ° ΡΠ΅ ΡΠ° ΡΠΏΠ°ΠΊΡΠ²Π°ΠΌΠ΅ Π²ΠΎ ΡΠ»ΠΈΠΊΠ°, ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π΄Π° Π³ΠΎ Π·Π°Π±ΡΠ·Π°ΠΌΠ΅ Π³ΡΠ°Π΄Π΅ΡΠ΅ΡΠΎ ΠΈ ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΠΈΡΠ°Π½ΡΠΈΡΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Π°Ρ ΠΎΠ²ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
ΠΠΌΠ°ΠΌΠ΅ Π΄ΠΎΠ±ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π²ΠΎ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΌΡΠΊΠΈ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠΈ:
Π‘Π΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ Π²ΠΎ GitLab. ΠΠΈΠ΅ ΡΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ ΡΠ»ΠΈΠΊΠΈ, Π³ΠΈ ΡΡΡΠΊΠ°ΠΌΠ΅ Π²ΠΎ GitLab Registry ΠΈ Π³ΠΈ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΠΌΠ΅ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ. ΠΠ°ΡΠ΄ΠΎΠ»Π³Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΠΎΠ²Π°Π° Π»ΠΈΡΡΠ° Π΅ ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠ»ΠΈΠΊΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ: Π±Π΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ°, ΡΠ΅ΠΊΠΎΡΠ° ΠΈΠ·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°Π΄Π½ΠΈΠΎΡ Π΄Π΅Π» ΡΡΠ°Π΅ΡΠ΅ 14 ΠΌΠΈΠ½ΡΡΠΈ.
ΠΠ° ΠΊΡΠ°ΡΠΎΡ, ΡΡΠ°Π½Π° ΡΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΆΠΈΠ²Π΅Π΅ΠΌΠ΅ Π²Π°ΠΊΠ° ΠΈ ΡΠ΅Π΄Π½Π°Π²ΠΌΠ΅ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΠΌΠ΅ Π·ΠΎΡΡΠΎ ΡΠΎΠ»ΠΊΡ Π΄ΠΎΠ»Π³ΠΎ ΡΠ΅ ΡΠΎΠ±ΠΈΡΠ°Π°Ρ ΡΠ»ΠΈΠΊΠΈΡΠ΅. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΡΠΏΠ΅Π°Π²ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ Π½Π° 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 ΡΠ»ΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠ΅ΡΠΈΡΠ°. ΠΠΊΠΎ Π½ΠΈΡΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΌΠ΅Π½ΠΈΠ»ΠΎ ΠΎΠ΄ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π³ΡΠ°Π΄Π΅ΡΠ΅, ΡΠΎΠ³Π°Ρ Π½Π°ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ° ΠΈΠ·Π²ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, Π΄ΠΎΠΊΠ΅ΡΠΎΡ ΡΠ΅ Π·Π΅ΠΌΠ΅ Π³ΠΎΡΠΎΠ² ΡΠ»ΠΎΡ. ΠΠΈΠ΄Π΅ΡΡΠΈ Π³Π»Π°Π²Π½ΠΎΡΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π°ΡΠ΅ Π½Π° Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΡΠ΅ ΡΠ΅ Π΄ΠΎΠ»ΠΆΠΈ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΊΠ΅ΡΠΎΡ, ΠΏΡΠΈ ΠΌΠ΅ΡΠ΅ΡΠ΅ΡΠΎ Π½Π° Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΡΠ΅ ΠΎΠ±ΡΠ½Π΅ΠΌΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΡΠ»ΠΈΠΊΠ° ΡΠΎ Π³ΠΎΡΠΎΠ² ΠΊΠ΅Ρ. ΠΠ½Π°ΡΠΈ, ΡΠ΅ΠΊΠΎΡ ΠΏΠΎ ΡΠ΅ΠΊΠΎΡ:
- ΠΠΈΠ΅ Π³ΠΈ Π±ΡΠΈΡΠ΅ΠΌΠ΅ ΡΠ»ΠΈΠΊΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π²Π»ΠΈΡΠ°Π°Ρ Π½Π° ΡΠ΅ΡΡΠΎΡ.
docker rmi $(docker images -q)
- ΠΠ° Π»Π°Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π·Π° ΠΏΡΠ² ΠΏΠ°Ρ.
time docker build -t app .
- ΠΠ° ΠΌΠ΅Π½ΡΠ²Π°ΠΌΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° src/index.html - ΡΠ° ΠΈΠΌΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Ρ.
- ΠΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° ΡΠ° Π²ΠΎΠ΄ΠΈΠΌΠ΅ ΠΏΠΎ Π²ΡΠΎΡ ΠΏΠ°Ρ.
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. ΠΡΠ²ΠΎΡΠ΅Π½Π° Π²ΠΎ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ
ΠΠ°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ° ΠΎΠ΄ 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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ:
Π‘Π΅Π³Π° Π΄Π° ΡΠ° ΡΠΌΠ΅Π½ΠΈΠΌΠ΅ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΊΠ΅ΡΠΎΡ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΡΠ»ΠΈΠΊΠΈ:
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 Π΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ°Ρ Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΡΠ»ΠΎΠ΅Π²ΠΈΡΠ΅ Π²ΠΎ Π΄ΡΡΠ³Π° 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
...
ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ, Π½ΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈΡΠ΅ ΡΠ»ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΊΠΎΡΠΈΡΠ½ΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΈΡΡΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ Π²ΠΎ ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ Π½ΠΈΠ².
Π Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π·Π°Π±ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° Π΄ΠΎΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΠΈ. ΠΠΊΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π΄Π° ΠΎΠ΄ΠΈ Π±ΡΠ·ΠΎ, ΠΎΠ±ΠΈΠ΄Π΅ΡΠ΅ ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²Π° Π²ΠΎ Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ:
- Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΡ;
- ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΌΠ°Π»ΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈ ΡΠ»ΠΈΠΊΠΈ;
- ΠΏΠΎΠ²Π΅ΡΠ΅ΡΡΠ΅ΠΏΠ΅Π½ΠΎ ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅;
- ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ΠΎΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π²ΠΎ Dockerfile Π·Π° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΠ΅ΡΠΎΡ;
- ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΊΠ΅Ρ Π²ΠΎ CI/CD ΡΠΈΡΡΠ΅ΠΌΠΈ;
- ΠΏΡΠ΅Π»ΠΈΠΌΠΈΠ½Π°ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½Π° ΡΠ»ΠΈΠΊΠΈ.
Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ ΡΠ΅ Π²ΠΈ Π΄Π°Π΄Π΅ ΠΏΠΎΡΠ°ΡΠ½ΠΎ ΠΊΠ°ΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Docker ΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π²Π°ΡΠ΅ΡΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅. ΠΠ° Π΄Π° ΡΠΈ ΠΏΠΎΠΈΠ³ΡΠ°ΡΠ΅ ΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΠ΄ ΡΡΠ°ΡΠΈΡΠ°ΡΠ°, ΡΠΎΠ·Π΄Π°Π΄Π΅Π½ΠΎ Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅
ΠΠ·Π²ΠΎΡ: www.habr.com