ΠΡΠ΅Π΄ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π΄Π° ΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, Π² Π½Π°ΡΠ΅ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΈ ΠΈ CI/CD, ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ Π΄ΡΠ»ΡΠ³ ΠΏΡΡ ΠΎΡ ΠΊΠΎΠΌΠΈΡ Π΄ΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°. ΠΡΠ΅Π΄ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠ°ΡΠΈΡ Π½ΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ FTP (Π° ΡΠ°ΠΊΠ° Π²Π΅ΡΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ ΠΏΡΠ°Π²ΠΈ, Π½Π°Π»ΠΈ?), ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° "Π΄Π΅ΠΏΠ»ΠΎΠΉ" ΠΎΡΠ½Π΅ΠΌΠ°ΡΠ΅ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅Ρ merge request ΠΈ Π΄Π° ΡΠ°ΠΊΠ°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅.
Π§Π°ΡΡ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Docker ΠΎΠ±ΡΠ°Π·Π°. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΎΡΠ½Π΅ΠΌΠ° ΠΌΠΈΠ½ΡΡΠΈ, Π° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° β Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΠΌΠΈΠ½ΡΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΎΠΏΠ°ΠΊΡΠ΅ΠΌ Π² ΠΎΠ±ΡΠ°Π·, ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠ°Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.

ΠΠΌΠ°ΠΌΠ΅ Π΄ΠΎΠ±ΡΡ ΠΎΠΏΠΈΡ Π² ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΡΠ°ΠΉΡΠΎΠ²Π΅ Π·Π° ΠΌΠ΅Π΄ΠΈΠΈ: , , , β¦ Π‘ΡΠ²ΡΠ΅ΠΌ ΡΠΊΠΎΡΠΎ ΠΏΠΎΠΏΡΠ»Π½ΠΈΡ ΠΌΠ΅ ΠΏΠΎΡΡΡΠΎΠ»ΠΈΠΎΡΠΎ ΡΠΈ, ΠΏΡΡΠΊΠ°ΠΉΠΊΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ ΡΠ°ΠΉΡ . Π Π΄ΠΎΠΊΠ°ΡΠΎ Π±ΡΡΠ·ΠΎ Π΄ΠΎΠΈΠ·ΠΏΠΈΠΏΠ²Π°Ρ ΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΡΡ ΠΌΠ΅ ΡΡΠ°ΡΠΈ Π±ΡΠ³ΠΎΠ²Π΅, Π±Π°Π²Π½ΠΈΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΡΠ΅ ΠΎΠΊΠ°Π·Π° Π³ΠΎΠ»ΡΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠ°Π²ΠΈΠΌ Π½Π° GitLab. ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°Π·ΠΈ, ΠΏΡΡΠΊΠ°ΠΌΠ΅ Π² GitLab Registry ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΡΠ°. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ Π½Π°ΠΉ-Π΄ΡΠ»Π³ΠΎΡΠΎ Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: Π±Π΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²ΡΡΠΊΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° ΠΎΡΠ½Π΅ΠΌΠ°ΡΠ΅ 14 ΠΌΠΈΠ½ΡΡΠΈ.
![]()
Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠ°Π½Π° ΡΡΠ½ΠΎ, ΡΠ΅ ΡΠ°ΠΊΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°, ΠΈ ΡΠ΅ Π·Π°Π΅Ρ ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π·Π°ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Ρ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΡΠ»Π³ΠΎ. Π ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΡΠΊΡΠ°ΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π΄ΠΎ 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 --prodDockerfile Π΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ ΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ; ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠ° ΠΎΡ ΡΡΡ 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 .
ΠΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π±ΠΈΠ»Π΄ Π΄ΠΎ 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.000s607.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. ΠΡΠ²Π°ΡΡΠΌΠ΅ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ!

ΠΠ°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π·Π° ΠΎΡ 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.000s46 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π²ΠΌΠ΅ΡΡΠΎ 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 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ:

Π‘Π΅Π³Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ΅Ρ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ:
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, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΠΊΠ΅Ρ.

ΠΠ±ΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π΅ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ Π½Π° 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 ΠΎΠ±ΡΠ°Π·ΠΈ. ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π΄Π΅ΠΏΠ»ΠΎΠΉΠ²Π°ΡΠ΅ Π±ΡΡΠ·ΠΎ, ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈ:
- Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°;
- ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ;
- ΠΌΡΠ»ΡΠΈΡΡΠ΅ΠΉΠ΄ΠΆ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅;
- ΡΠΌΡΠ½Π° Π½Π° ΡΠ΅Π΄Π° Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π² Dockerfile, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ΅ΡΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ;
- Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΊΠ΅ΡΠ° Π² CI/CD ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅;
- ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ.
ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ΅ ΡΡΠ°Π½Π΅ ΠΏΠΎ-ΡΡΠ½ΠΎ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Docker ΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½ΠΎ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΠ²ΠΎΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ. ΠΠ° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΡ ΡΡΠ°ΡΠΈΡΡΠ°, Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ. .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
