ΠΡΠ΅Π΄ΠΈ Π΄Π°Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, Π² ΡΠ΅Π·ΠΈ Π΄Π½ΠΈ Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΈ ΠΈ CI/CD, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΌΠΈΠ½Π΅ Π΄ΡΠ»ΡΠ³ ΠΏΡΡ ΠΎΡ Π°Π½Π³Π°ΠΆΠΈΡΠ°Π½Π΅ Π΄ΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ Π΄Π° ΠΊΠ°ΡΠ²Π°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΠ΅Π· FTP (Π²Π΅ΡΠ΅ Π½ΠΈΠΊΠΎΠΉ Π½Π΅ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ, Π½Π°Π»ΠΈ?) ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° βΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅β ΠΎΡΠ½Π΅ΠΌΠ°ΡΠ΅ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΡΠ»ΠΈΠ²Π°Π½Π΅ ΠΈ Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΡΠ΅ Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π΄ΠΎΡΡΠΈΠ³Π½Π΅ Π΄ΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅.
Π§Π°ΡΡ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΏΡΡ Π΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Docker ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° ΠΌΠΈΠ½ΡΡΠΈ, ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΄Π΅ΡΠ΅ΡΠΊΠΈ ΠΌΠΈΠ½ΡΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ΄Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΎΠΏΠ°ΠΊΠΎΠ²Π°ΠΌΠ΅ Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠ°Π½ΡΠΈΡΠ΅ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
ΠΠΌΠ°ΠΌΠ΅ Π΄ΠΎΠ±ΡΡ ΠΎΠΏΠΈΡ Π² ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ ΡΠ΅Π±ΡΠ°ΠΉΡΠΎΠ²Π΅:
Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Π² GitLab. ΠΠΈΠ΅ ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΌΠ΅ Π³ΠΈ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° GitLab ΠΈ Π³ΠΈ ΠΏΡΡΠΊΠ°ΠΌΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ. ΠΠ°ΠΉ-Π΄ΡΠ»Π³ΠΎΡΠΎ Π½Π΅ΡΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠΏΠΈΡΡΠΊ Π΅ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ: Π±Π΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π²ΡΡΠΊΠ° Π±Π΅ΠΊΠ΅Π½Π΄ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΎΡΠ½Π΅ 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
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ ΠΎΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Alpine
ΠΡΡΠ³ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠΏΠ΅ΡΡΠΈΡΠ΅ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΡΡ ΠΎΠ±ΡΠ°Π· Π΅ ΠΎΠ±ΡΠ°Π·ΡΡ, Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π³ΠΎΡΠ²Ρ Π½Π°ΡΠΈΡΡ ΠΎΠ±ΡΠ°Π·. ΠΠΎΠ»Π½ΠΈΡΡ ΡΠ»ΠΎΠΉ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° FROM
Π² Dockerfile. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Ubuntu ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ nodejs. Π ΡΠ΅ΠΆΠΈ...
$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB
... ΠΏΠΎΡΡΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ. ΠΠΎΠΆΠ΅ΡΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ ΡΠΈΠ»Π°ΡΠ° Π½Π° Π·Π²ΡΠΊΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Alpine Linux. Alpine Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΡΠΊ Linux. ΠΠΎΠΊΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° 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 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". Π²ΡΡΠ½ΠΎ! ΠΠ½ΠΆΠΈΠ½ΠΈΠΊΡΠΈ. ΠΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ 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 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.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 .
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