ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠΈΡΠ° ΠΏΠΎΠΏΠ°Π΄Π΅Ρ Π½Π° ΠΏΡΠΎΠ΄, Π² Π½Π°ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΎΠ² ΠΈ 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 --prod
Dockerfile β ΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ; Π²ΡΠΏΠΎΠ»Π½ΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΈΠ· Π½ΠΈΡ , Docker Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΈ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ ΠΈΡ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅. ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΠ»ΠΎΠΉ. Π Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· β ΡΡΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ½Π½ΡΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠ»ΠΎΠΈ.
Π§ΡΠΎ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»ΠΎΠΉ Π΄ΠΎΠΊΠ΅Ρ ΡΠΌΠ΅Π΅Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΡΠ»ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ Ρ ΠΏΡΠΎΡΠ»ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ, ΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄ΠΎΠΊΠ΅Ρ Π²ΠΎΠ·ΡΠΌΡΡ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΈΡΠΎΡΡ Π² ΡΠΊΠΎΡΠΎΡΡΠΈ ΡΠ±ΠΎΡΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π·Π° ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΡΡΠ°, Π² Π·Π°ΠΌΠ΅ΡΠ°Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ ΡΠ±ΠΎΡΠΊΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΠ±ΠΎΡΠΊΡ ΠΎΠ±ΡΠ°Π·Π° Ρ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΊΡΡΠ΅ΠΌ. ΠΡΠ°ΠΊ, ΠΏΠΎ ΡΠ°Π³Π°ΠΌ:
- Π£Π΄Π°Π»ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π·Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠΈ Π½Π΅ Π²Π»ΠΈΡΠ»ΠΈ Π½Π° ΡΠ΅ΡΡ.
docker rmi $(docker images -q)
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±ΠΈΠ»Π΄ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·.
time docker build -t app .
- ΠΠ΅Π½ΡΠ΅ΠΌ ΡΠ°ΠΉΠ» src/index.html β ΠΈΠΌΠΈΡΠΈΡΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°.
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π±ΠΈΠ»Π΄ Π²ΡΠΎΡΠΎΠΉ ΡΠ°Π·.
time docker build -t app .
ΠΡΠ»ΠΈ ΡΡΠ΅Π΄Ρ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·ΠΎΠ² Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ (ΠΎ ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅), ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΡΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π° Π±ΠΎΡΡΡ ΠΊΡΡΠΊΡ ΠΊΡΡΠ΅ΠΉ. ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° β Π½Π°ΡΡΠΈΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΡΠ»Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π±ΡΡΡΡΠΎ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, ΡΡΠΎ Π·Π°ΠΏΡΡΠΊ ΡΠ±ΠΎΡΠΊΠΈ Π±Π΅Π· ΠΊΡΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· β ΡΠ°ΠΌΡΠΉ ΠΏΠ΅ΡΠ²ΡΠΉ, β ΡΡΠ°Π»ΠΎ Π±ΡΡΡ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌ Π±ΡΠ» ΡΡΠΎΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·. Π ΡΠ΅ΡΡΠ°Ρ Π½Π°ΠΌ Π²Π°ΠΆΠ΅Π½ Π²ΡΠΎΡΠΎΠΉ Π·Π°ΠΏΡΡΠΊ ΡΠ±ΠΎΡΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΊΡΡΠΈ ΡΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ ΠΈ ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ ΠΏΠ΅ΡΡ Π½Π°Ρ ΠΏΠΈΡΠΎΠ³. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ²Π΅ΡΡ ΡΠΊΠ°ΠΆΡΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΡΠΎΠΆΠ΅.
ΠΠΎΠ»ΠΎΠΆΠΈΠΌ 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
ΠΠ΅ΡΠ΅Π΄ ΡΠ±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΊΠ΅Ρ Π±Π΅ΡΠ΅Ρ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ
ΡΠ²ΠΎΠ΅ΠΌΡ Π΄Π΅ΠΌΠΎΠ½Ρ Sending build context to Docker daemon 409MB
. ΠΠΎΠ½ΡΠ΅ΠΊΡΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ build. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ β Β«.Β», β ΠΈ Π΄ΠΎΠΊΠ΅Ρ ΡΠ°ΡΠΈΡ Π²ΡΡ, ΡΡΠΎ Π΅ΡΡΡ Ρ Π½Π°Ρ Π² ΡΡΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅. 409 ΠΠ±Π°ΠΉΡ β ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΎ: Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΡΠΌΠ°ΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ.
Π£ΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ
Π§ΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π΅ΡΡΡ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ°. ΠΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π½ΡΠΆΠ½ΡΠ΅ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ, Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π΄ΠΎΠΊΠ΅ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΡΡ ΠΏΠ°ΠΏΠΊΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: ΡΡΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΡΠ°ΡΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π² ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°ΠΉΠ» .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 ΠΠ±Π°ΠΉΡ β Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ 409 ΠΠ±Π°ΠΉΡ. Π Π΅ΡΡ ΠΌΡ ΡΠΌΠ΅Π½ΡΡΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π·Π° Ρ 1.74 Π΄ΠΎ 1.38ΠΠ±Π°ΠΉΡ:
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 β ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ Π»ΠΈΠ½ΡΠΊΡ. ΠΠΎΠΊΠ΅Ρ-ΠΎΠ±ΡΠ°Π· Π΄Π»Ρ nodejs Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ alpine Π²Π΅ΡΠΈΡ Π²ΡΠ΅Π³ΠΎ 88.5 ΠΠ±Π°ΠΉΡ. ΠΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π½Π°Ρ ΠΆΠΈΠΈΠΈΠΈΡΠ½ΡΠΉ Π²Π΄ΠΎΠΌΠ°Ρ ΠΎΠ±ΡΠ°Π·:
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 Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ Π±Π΅Π· ΠΏΠΈΡΠΎΠ½Π° Β―(Β°_o)/Β―
ΠΠΎ Π·Π°ΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π·Π° ΡΠ±ΡΠΎΡΠΈΠ» 150 ΠΠ±Π°ΠΉΡ:
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. ΠΠΎ ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΠΏΡΠΎΡΠ΅. Π£Π³Π°Π΄Π°ΠΉΡΠ΅ ΡΡΡΡΠΊΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅ΡΡΡΠ΅ Π±ΡΠΊΠ²Ρ Β«ΡΒ». ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ! Π«Π½ΠΆΡΠ½ΡΠΊΡΡ. ΠΠΎΠ·ΡΠΌΡΠΌ ΠΎΠ±ΡΠ°Π· Ρ 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 .
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π΄Π²Π΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ 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 ΠΠ±Π°ΠΉΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΏΡΠΎΠ΄. ΠΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π΅ΡΠ½ΡΠΌΡΡ ΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ±ΠΎΡΠΊΠΈ.
$ 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.000s
46 ΡΠ΅ΠΊΡΠ½Π΄ Π²ΠΌΠ΅ΡΡΠΎ 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 Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΡΠ»ΠΎΠΈ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π° c nodejs (ΡΡΠ΅ΠΉΠ΄ΠΆ builder). ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π· $IMAGE_NAME-builder-stage
ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² GitHub Packages, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ±ΠΎΡΠΊΠ΅ ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΊΡΡΠ°.
ΠΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ ΡΠΎΠΊΡΠ°ΡΠΈΠ»ΠΎΡΡ Π΄ΠΎ ΠΏΠΎΠ»ΡΡΠΎΡΠ° ΠΌΠΈΠ½ΡΡ. ΠΠΎΠ»ΠΌΠΈΠ½ΡΡΡ ΡΡΠ°ΡΠΈΡΡΡ Π½Π° ΠΏΠΎΠ΄ΡΡΠ³ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ²
ΠΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΈΡΡΠΎΠ³ΠΎ ΠΊΡΡΠ° Π΄ΠΎΠΊΠ΅ΡΠ° β ΡΠ°ΡΡΡ ΡΠ»ΠΎΡΠ² Π²ΡΠ½Π΅ΡΡΠΈ Π² Π΄ΡΡΠ³ΠΎΠΉ 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
...
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ Π½Π΅ ΡΠΌΠ΅Π½ΡΡΠΈΠ»ΠΎΡΡ, Π½ΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π²ΠΈΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ Π΄ΠΎΠΊΠ΅Ρ-ΠΎΠ±ΡΠ°Π·ΠΎΠ². ΠΡΠ»ΠΈ Ρ ΠΎΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ» Π±ΡΡΡΡΠΎ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π² ΡΠ²ΠΎΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅:
- ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°;
- ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²;
- ΠΌΡΠ»ΡΡΠΈΡΡΠ΅ΠΉΠ΄ΠΆ-ΡΠ±ΠΎΡΠΊΡ;
- ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π² Dockerfile, ΡΡΠΎΠ±Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΡΡ;
- Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΊΡΡΠ° Π² CI/CD-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ;
- ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ².
ΠΠ°Π΄Π΅ΡΡΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠ°Π½Π΅Ρ ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Docker, ΠΈ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π²Π°Ρ Π΄Π΅ΠΏΠ»ΠΎΠΉ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΈΠ· ΡΡΠ°ΡΡΠΈ, ΡΠΎΠ·Π΄Π°Π½ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com