Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² werf Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Dockerfile

Π›ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ·Π΄Π½ΠΎ, Ρ‡Π΅ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π°. Или ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ‡ΡƒΡ‚ΡŒ Π½Π΅ допустили ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½Π΅ имСя ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Dockerfiles для сборки ΠΎΠ±Ρ€Π°Π·ΠΎΠ² прилоТСния.

Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² werf Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Dockerfile

Π Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎ werf β€” GitOps-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ, которая интСгрируСтся с любой CI/CD-систСмой ΠΈ обСспСчиваСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ всСм ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ прилоТСния, позволяя:

  • ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹,
  • Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ прилоТСния Π² Kubernetes,
  • ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ.


Ѐилософия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ инструмСнты Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ систСму, Π΄Π°ΡŽΡ‰ΡƒΡŽ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ прилоТСниями. По возмоТности Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ задСйствованы ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ (Π²Ρ€ΠΎΠ΄Π΅ Helm ΠΈ Docker). Если ΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅Ρ‚ β€” ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всё Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для этого.

ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ: свой сборщик ΠΎΠ±Ρ€Π°Π·ΠΎΠ²

Π’Π°ΠΊ ΠΈ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ со сборщиком ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π² werf: ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Dockerfile Π½Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ. Если Π±Π΅Π³Π»ΠΎ ΠΎΠΊΡƒΠ½ΡƒΡ‚ΡŒΡΡ Π² ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡ€ΠΎΡΠ²ΠΈΠ»Π°ΡΡŒ ΡƒΠΆΠ΅ Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… вСрсиях werf (Ρ‚ΠΎΠ³Π΄Π° Π΅Ρ‰Π΅ извСстного ΠΊΠ°ΠΊ dapp).

Боздавая инструмСнт для сборки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹, ΠΌΡ‹ быстро поняли, Ρ‡Ρ‚ΠΎ Dockerfile Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡:

  1. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ нСбольшиС Π²Π΅Π±-прилоТСния ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ стандартной схСмС:
    • ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ общСсистСмныС зависимости прилоТСния,
    • ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ bundle Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ зависимостСй прилоТСния,
    • ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ассСты,
    • ΠΈ самоС Π²Π°ΠΆΠ½ΠΎΠ΅ β€” ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π² ΠΎΠ±Ρ€Π°Π·Π΅ быстро ΠΈ эффСктивно.
  2. ΠŸΡ€ΠΈ измСнСниях Π² Ρ„Π°ΠΉΠ»Π°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° сборщик Π΄ΠΎΠ»ΠΆΠ΅Π½ быстро ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ слой ΠΏΡƒΡ‚Π΅ΠΌ налоТСния ΠΏΠ°Ρ‚Ρ‡Π° Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.
  3. Если помСнялись ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ ΡΡ‚Π°Π΄ΠΈΡŽ.

На сСгодняшний дСнь Π² нашСм сборщикС Π΅ΡΡ‚ΡŒ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности, Π½ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ТСлания ΠΈ ΠΏΠΎΠ·Ρ‹Π²Ρ‹ Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΎΠ²Ρ‹.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π½Π΅Π΄ΠΎΠ»Π³ΠΎ думая, ΠΌΡ‹ Π²ΠΎΠΎΡ€ΡƒΠΆΠΈΠ»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ языком программирования (см. Π½ΠΈΠΆΠ΅) ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈΡΡŒ Π² ΠΏΡƒΡ‚ΡŒ β€” Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ собствСнный DSL! БоотвСтствуя поставлСнным Π·Π°Π΄Π°Ρ‡Π°ΠΌ, ΠΎΠ½ Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для описания процСсса сборки ΠΏΠΎ стадиям ΠΈ опрСдСлСния зависимостСй этих стадий ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ². А дополнял Π΅Π³ΠΎ собствСнный сборщик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π» DSL Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ†Π΅Π»ΡŒ β€” собранный ΠΎΠ±Ρ€Π°Π·. Π‘Π½Π°Ρ‡Π°Π»Π° DSL Π±Ρ‹Π» Π½Π° Ruby, Π° ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Golang β€” ΠΊΠΎΠ½Ρ„ΠΈΠ³ нашСго сборщика стал ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² YAML-Ρ„Π°ΠΉΠ»Π΅.

Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² werf Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Dockerfile
Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ для dapp Π½Π° Ruby

Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² werf Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Dockerfile
ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ для werf Π½Π° YAML

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сборщика Ρ‚ΠΎΠΆΠ΅ мСнялся со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ просто Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° Π»Π΅Ρ‚Ρƒ Π½Π΅ΠΊΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Dockerfile ΠΈΠ· нашСй ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π° ΠΏΠΎΡ‚ΠΎΠΌ стали Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сборочныС инструкции Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ commit.

NB: На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ наш сборщик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со своим ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ (Π² YAML) ΠΈ называСтся Stapel-сборщиком, ΡƒΠΆΠ΅ развился Π² достаточно ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт. Π•Π³ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠ΅ описаниС заслуТиваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… статСй, Π° основныС подробности ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ОсознаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Но ΠΌΡ‹ поняли, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ сразу, Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ: Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹ Ρ‡Π΅Ρ€Π΅Π· стандартный Dockerfile ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ‚Ρƒ ΠΆΠ΅ инфраструктуру комплСксного управлСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (Ρ‚.Π΅. ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Ρ‹, Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ ΠΈ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ…). Как ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ инструмСнт для дСплоя Π² Kubernetes ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Dockerfile, Ρ‚.Π΅. стандартного способа описания ΠΎΠ±Ρ€Π°Π·ΠΎΠ² для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²?..

ВмСсто ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΠΎΠΉ вопрос ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Ρƒ вас ΡƒΠΆΠ΅ имССтся Dockerfile (ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€ Dockerfile’ов) ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ werf?

NB: К слову, с Ρ‡Π΅Π³ΠΎ Π±Ρ‹ Π²Π°ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ werf? ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ сводятся ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

  • ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» управлСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ очистку ΠΎΠ±Ρ€Π°Π·ΠΎΠ²;
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сборкой сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°;
  • ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹ΠΉ процСсс дСплоя Ρ‡Π°Ρ€Ρ‚ΠΎΠ², совмСстимых с Helm.

Π‘ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΡ… списком ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π½Π° страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π˜Ρ‚Π°ΠΊ, Ссли Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΡ‹ Π±Ρ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Dockerfile Π½Π° наш ΠΊΠΎΠ½Ρ„ΠΈΠ³, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ с Ρ€Π°Π΄ΠΎΡΡ‚ΡŒΡŽ скаТСм: Β«ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ werf ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ваши Dockerfile’ы!Β»

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Полная рСализация этой возмоТности появилась Π² Ρ€Π΅Π»ΠΈΠ·Π΅ werf v1.0.3-beta.1. ΠžΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ прост: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Dockerfile Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ werf, послС Ρ‡Π΅Π³ΠΎ запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ werf build… ΠΈ всё β€” werf собСрёт ΠΎΠ±Ρ€Π°Π·. Рассмотрим Π½Π° абстрактном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Объявим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Dockerfile Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

FROM ubuntu:18.04
RUN echo Building ...

И объявим werf.yaml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот Dockerfile:

configVersion: 1
project: dockerfile-example
---
image: ~
dockerfile: ./Dockerfile

Всё! ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ werf build:

Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Docker-ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² werf Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Dockerfile

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ werf.yaml для сборки сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… Dockerfile’ов:

configVersion: 1
project: dockerfile-example
---
image: backend
dockerfile: ./dockerfiles/Dockerfile-backend
---
image: frontend
dockerfile: ./dockerfiles/Dockerfile-frontend

НаконСц, поддСрТиваСтся ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сборки β€” Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ --build-arg ΠΈ --add-host β€” Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ werf. ПолноС описаниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Dockerfile image доступно Π½Π° страницС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π’ процСссС сборки Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ стандартный кэш Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… слоёв Π² Docker. Однако, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, werf Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Dockerfile Π² свою инфраструктуру. Π§Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚?

  1. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·, собранный ΠΈΠ· Dockerfile, состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ stage ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ dockerfile (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ stages Π² werf, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ здСсь).
  2. Для stage’а dockerfile werf рассчитываСт сигнатуру, которая зависит ΠΎΡ‚ содСрТимого ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Dockerfile. ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Dockerfile происходит смСна сигнатуры стадии dockerfile ΠΈ werf ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ пСрСсборку этой стадии с Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ Dockerfile. Если ΠΆΠ΅ сигнатура Π½Π΅ мСняСтся, Ρ‚ΠΎ werf Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π· ΠΈΠ· кэша (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± использовании сигнатур Π² werf Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΎΡΡŒ Π² этом Π΄ΠΎΠΊΠ»Π°Π΄Π΅).
  3. Π”Π°Π»Π΅Π΅ собранныС ΠΎΠ±Ρ€Π°Π·Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ werf publish (ΠΈΠ»ΠΈ werf build-and-publish) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для дСплоя Π² Kubernetes. ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·Ρ‹ Π² Docker Registry Π±ΡƒΠ΄ΡƒΡ‚ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒΡΡ стандартными срСдствами очистки werf, Ρ‚.Π΅. ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ автоматичСская очистка старых ΠΎΠ±Ρ€Π°Π·ΠΎΠ² (ΡΡ‚Π°Ρ€ΡˆΠ΅ N Π΄Π½Π΅ΠΉ), ΠΎΠ±Ρ€Π°Π·ΠΎΠ², связанных с Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Git-Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ, ΠΈ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± описанных здСсь ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΈ прСдостороТности

1. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ URL Π² ADD Π½Π΅ поддСрТиваСтся

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ поддСрТиваСтся использованиС внСшнСго URL Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ ADD. Werf Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ пСрСсборку ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ рСсурса ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ URL. Π’ скором Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ планируСтся Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ возмоТности.

2. НСльзя Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ .git Π² ΠΎΠ±Ρ€Π°Π·

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ .git Π² ΠΎΠ±Ρ€Π°Π· β€” порочная плохая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ Π²ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ:

  1. Если .git остаСтся Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·Π΅, это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ 12 factor app: ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ связан с ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ возмоТности ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ git checkout ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°.
  2. .git ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·Π° (Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большим ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ большиС Ρ„Π°ΠΉΠ»Ρ‹, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ). Π Π°Π·ΠΌΠ΅Ρ€ ΠΆΠ΅ work-tree, связанного Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ истории ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Git. ΠŸΡ€ΠΈ этом Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ .git ΠΈΠ· Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° Π½Π΅ сработаСт: ΠΎΠ±Ρ€Π°Π· всС Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅Ρ‚ лишний слой β€” Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Docker.
  3. Docker ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лишнюю пСрСсборку, Π΄Π°ΠΆΠ΅ Ссли ΠΈΠ΄Π΅Ρ‚ сборка ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π½ΠΎ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… work-tree. НапримСр, GitLab создаСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ склонированныС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π² /home/gitlab-runner/builds/HASH/[0-N]/yourproject ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ сборкС. Π›ΠΈΡˆΠ½ΡΡ пСрСсборка Π±ΡƒΠ΄Π΅Ρ‚ связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ дирСктория .git отличаСтся Π² Ρ€Π°Π·Π½Ρ‹Ρ… склонированных вСрсиях ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ рСпозитория, Π΄Π°ΠΆΠ΅ Ссли собираСтся ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠΌΠΌΠΈΡ‚.

ПослСдний ΠΏΡƒΠ½ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ послСдствиС ΠΈ ΠΏΡ€ΠΈ использовании werf. Werf Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ собранный кэш присутствовал ΠΏΡ€ΠΈ запускС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, werf deploy). Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ werf рассчитываСт сигнатуры стадий для ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² werf.yaml, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² сборочном кэшС β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ смоТСт ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если ΠΆΠ΅ сигнатура стадий Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ содСрТимого .git, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ нСустойчивый ΠΊ измСнСниям Π² Π½Π΅Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… кэш, ΠΈ werf Π½Π΅ смоТСт ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΠΏΠ»ΠΎΡˆΠ½ΠΎΡΡ‚ΡŒ (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ).

Π’ Ρ†Π΅Π»ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ADD Π² любом случаС ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ написанного Dockerfile, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ кэша, собранного ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ Dockerfile, ΠΊ Π½Π΅Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΌ измСнСниям Π² Git.

Π˜Ρ‚ΠΎΠ³

Наш ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ с написаниСм своСго сборщика для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… потрСбностСй Π±Ρ‹Π» тяТСлым, чСстным ΠΈ прямолинСйным: вмСсто использования костылСй ΠΏΠΎΠ²Π΅Ρ€Ρ… стандартного Dockerfile ΠΌΡ‹ написали своё Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с кастомным синтаксисом. И это Π΄Π°Π»ΠΎ свои ΠΏΠ»ΡŽΡΡ‹: Stapel-сборщик ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ справляСтся со своСй Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

Однако Π² процСссС написания собствСнного сборщика ΠΌΡ‹ упустили ΠΈΠ· Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Dockerfile’ов. БСйчас этот нСдостаток исправлСн, Π° Π² дальнСйшСм ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Dockerfile наряду с нашим кастомным сборщиком Stapel для распрСдСлСнной сборки ΠΈ для сборки с использованиСм Kubernetes (Ρ‚.Π΅. сборки Π½Π° runner’ах Π²Π½ΡƒΡ‚Ρ€ΠΈ Kubernetes, ΠΊΠ°ΠΊ это сдСлано Π² kaniko).

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ссли Ρƒ вас Π²Π΄Ρ€ΡƒΠ³ завалялось ΠΏΠ°Ρ€Π° Dockerfile’ов… ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ werf!

P.S. Бписок Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅: Β«werf β€” наш инструмСнт для CI/CD Π² Kubernetes (ΠΎΠ±Π·ΠΎΡ€ ΠΈ Π²ΠΈΠ΄Π΅ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π°)Β».

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ