ΠΡΠ΅Π΄ΠΈ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π΄Π° ΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°, Π² Π½Π°ΡΠ΅ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΈ ΠΈ 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.38GB:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest 4942f010792a ΠΏΡΠ΅Π΄ΠΈ 3 ΠΌΠΈΠ½ΡΡΠΈ 1.38GBΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΠΎΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π·Π°.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Alpine
ΠΡΠ΅ Π΅Π΄ΠΈΠ½ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠΏΠ΅ΡΡΠΈΠΌ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΎΠ±ΡΠ°Π·Π° β Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ°Π»ΡΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·. Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΡΡ ΠΎΠ±ΡΠ°Π· Π΅ ΠΎΠ±ΡΠ°Π·ΡΡ, Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π½Π°ΡΠΈΡΡ ΠΎΠ±ΡΠ°Π·. ΠΠΎΠ»Π½ΠΈΡΡ ΡΠ»ΠΎΠΉ ΡΠ΅ Π·Π°Π΄Π°Π²Π° Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° FROM Π² Dockerfile. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°Π· Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Ubuntu, Π² ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ nodejs. Π ΡΠ΅ΠΆΠΈ ...
$ docker images -a | grep node
node 12.16.2 406aa3abbc6c ΠΏΡΠ΅Π΄ΠΈ 17 ΠΌΠΈΠ½ΡΡΠΈ 916MB... ΠΏΠΎΡΡΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ. ΠΠ½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΠΎΠ±Π΅ΠΌΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±ΡΠ°Π· Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Alpine Linux. Alpine β ΡΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΡΠΊ Π»ΠΈΠ½ΡΠΊΡ. 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:
REPOSITORY TAG IMAGE ID CREATED SIZE
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;
}
}Π’ΠΎΠ²Π° ΡΠ΅ ΡΡΠ°Π½Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ΅ΡΠ°ΠΏΠ½Π°ΡΠ° ΡΠ±ΠΎΡΠΊΠ°. Π©Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΌ Π½Π°ΡΠΈΡ Dockerfile:
FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add
python
make
g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod
FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ FROM Π² Dockerfile, Π²ΡΡΠΊΠ° ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ²ΠΎΠΉ Π΅ΡΠ°ΠΏ Π½Π° ΡΠ±ΠΎΡΠΊΠ°. ΠΡΡΠ²ΠΈΡΡ Π½Π°ΡΠ΅ΠΊΠΎΡ
ΠΌΠ΅ builder, Π° ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ FROM ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ³ΠΎΡΠ²Ρ Π½Π°ΡΠΈΡΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π΅Π½ ΠΎΠ±ΡΠ°Π·. ΠΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠ° ΠΎΡ Π½Π°ΡΠ΅ΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ Π΅ΡΠ°ΠΏ Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΈΡ ΠΎΠ±ΡΠ°Π· Ρ nginx. Π Π°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΌΠ°Π»Ρ:
REPOSITORY TAG IMAGE ID CREATED SIZE
app latest 2c6c5da07802 29 minutes ago 36MBΠΠ΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ Π½Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π· ΠΈ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ:
docker run -p8080:80 appΠ‘ ΠΎΠΏΡΠΈΡΡΠ° -p8080:80 ΠΏΡΠΎΠ±ΠΈΡ ΠΌΠ΅ ΠΏΠΎΡΡΠ° 8080 Π½Π° Π½Π°ΡΠ°ΡΠ° Ρ ΠΎΡΡ ΠΌΠ°ΡΠΈΠ½Π° Π΄ΠΎ ΠΏΠΎΡΡΠ° 80 Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ nginx. ΠΡΠ²Π°ΡΡΠΌΠ΅ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½ΠΈ. ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ!

ΠΠ°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π·Π° ΠΎΡ 1.74 ΠΠ Π΄ΠΎ 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.338s. ΠΠ°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ? ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π·Π°ΡΠΎ ΡΠ΅ Π½Π΅ Π±ΡΡ
Π° ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΈ. Π€Π°ΠΊΡΡΡ Π΅, ΡΠ΅ ΠΠΎΠΊΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΠ»ΠΎΠΉ ΠΏΠΎ ΡΠ»ΠΎΠΉ, Π΄Π°Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΈΡΠ΅ Ρ Π½Π΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΈ. ΠΠ° ΡΠ΅ΡΠ²ΡΡΡΠ° ΡΡΡΠΏΠΊΠ° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΡΡΠ΅Π΄ ΡΡΡ
, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΠΎΠΊΠ΅Ρ Π½Π΅ ΡΠ°ΠΌΠΎ ΡΠ΅ Π½Π΅ Π²Π·Π΅ΠΌΠ° ΠΎΡ ΠΊΠ΅ΡΠ° ΡΠΎΠ·ΠΈ ΡΠ»ΠΎΠΉ, Π½ΠΎ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈ! ΠΠ΅ΠΊΠ° Π΄Π° Π²Π½Π΅ΡΠ΅ΠΌ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² 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.000s46 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ Π²ΠΌΠ΅ΡΡΠΎ 3 ΠΌΠΈΠ½ΡΡΠΈ β Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅! ΠΠ°ΠΆΠ΅Π½ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡΡ ΡΠ΅Π΄ Π½Π° ΡΠ»ΠΎΠ΅Π²Π΅ΡΠ΅: ΠΏΡΡΠ²ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΡΠ΄ΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ, Π° Π½Π°ΠΊΡΠ°Ρ β ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ΡΡΠΎ.
Π‘Π»Π΅Π΄Π²Π°Ρ ΠΌΠ°Π»ΠΊΠΎ Π΄ΡΠΌΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠΈ CI/CD.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΠΎΠ±ΡΠ°Π·ΠΈ Π·Π° ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅
ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½ΡΠΊΠ°ΠΊΠ²ΠΎ SaaS ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π»ΠΎΠΊΠ°Π»Π½ΠΈΡΡ ΠΊΠ΅Ρ Π½Π° ΠΠΎΠΊΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠΈΡΡ ΠΈ ΡΠ²Π΅ΠΆ. ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΠΎΠΊΠ΅Ρ Π΄Π° ΡΠ΅ ΡΠ΄ΠΎΠ±ΠΈΠ΅ Ρ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠ»ΠΎΠ΅Π²Π΅, Π΄Π°ΠΉΡΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎ ΡΡΠ±ΡΠ°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π·Π° ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² 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, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° ΠΊΠ΅Ρ.

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