Saate nĂŒĂŒd Docker-pilte werf-is ehitada ka tavalise Dockerfile'i abil

Paremini hilja kui kunagi. VÔi kuidas me peaaegu ei teinud tÔsist viga, kui meil ei olnud tavaliste Dockerfile'ide toetust rakenduste pildide koostamiseks.

Saate nĂŒĂŒd Docker-pilte werf-is ehitada ka tavalise Dockerfile'i abil

RÀÀgime werf — GitOps-utiliidist, mis integreerub iga CI/CD sĂŒsteemiga ja vĂ”imaldab hallata kogu rakenduse elutsĂŒkli, vĂ”imaldades:

  • koostada ja avaldada pilte,
  • rakenduste juurutamist Kuberneteses,
  • mitte kasutatavate piltide eemaldamist spetsiaalsete poliitikate abil.


Projekti filosoofia on koguda madala tasandi tööriistad ĂŒheks ĂŒhtseks sĂŒsteemiks, andes DevOps inseneridele kontrolli rakenduste ĂŒle. Kui vĂ”imalik, tuleks kasutada juba olemasolevaid utiliite (nagu Helm ja Docker). Kui aga mingisugust lahendust ei ole — saame luua ja toetada kĂ”ik vajalikud tööriistad.

Eelalugu: oma pildi koostaja

Nii juhtuski, et pildi koostajast werf'is: meil oli puudus tuttavast Dockerfile'ist. Kui kiiresti vaadata projekti ajalugu, ilmus see probleem juba werf'i algsetes versioonides (toona veel tuntud kui dapp).

Loo rakenduste koostamise tööriista Docker-piltide jaoks, mĂ”istsime kiiresti, et Dockerfile ei sobi meile mĂ”ningate konkreetsete ĂŒlesannete jaoks:

  1. Vajadus koostada tĂŒĂŒpilisi vĂ€ikeseid veebirakendusi jĂ€rgmise standardskeemi jĂ€rgi:
    • paigaldada rakenduse ĂŒldsĂŒsteemsed sĂ”ltuvused,
    • paigaldada rakenduse sĂ”ltuvuste kimbud,
    • koostada varasid,
    • ja kĂ”ige olulisem — uuendada koodi pildis kiiresti ja tĂ”husalt.
  2. Projektifailide muutumisel peab koostaja kiiresti looma uue kihi, rakendades muudatusi muudetud failidele.
  3. Kui teatud failid on muutunud, tuleb vastav sÔltuv etapp uuesti koostada.

TÀnaseks on meie koostajas palju muid vÔimalusi, kuid esialgsed soovid ja impulssid olid sellised.

KokkuvĂ”ttes, mĂ”tlemata kaua, relvastasime end kasutatava programmeerimiskeelega (vt allpool) ja suundusime teele — rakendama oma DSL-i! Vastavalt seatud ĂŒlesannetele oli see mĂ”eldud koostamisprotsessi etappide kirjeldamiseks ja nende etappide sĂ”ltuvuste mÀÀratlemiseks failidest. Ja seda tĂ€iendati oma koostajaga, mis muundas DSL-i lĂ”pliku eesmĂ€rgi — koostatud pildi. Algul oli DSL Ruby keeles, kuid ĂŒleminekul Golangi peale — meie koostaja konfiguratsioon hakkas olema kirjeldatud YAML-failis. — meie kogumishalduri konfiguratsioon hakkab olema kirjas YAML-failis.

Saate nĂŒĂŒd Docker-pilte werf-is ehitada ka tavalise Dockerfile'i abil
Vana konfiguraator dapp Ruby jaoks

Saate nĂŒĂŒd Docker-pilte werf-is ehitada ka tavalise Dockerfile'i abil
Aktiivne konfiguraator werf YAML jaoks

Koguja töömeetod on ajas muutunud. Alguses genereerisime lihtsalt reaalajas ajutise Dockerfile meie konfiguratsioonist, seejÀrel hakkasime kÀivitama ehitusjuhiseid ajutistes konteinerites ja tegema commit.

NB: Praegu on meie koguja, mis töötab oma konfigureerimisega (YAMLis) ja mida nimetatakse Stapel-kogujaks, juba arenenud ĂŒsna vĂ”imsaks tööriistaks. Selle pĂ”hjalik kirjeldus vÀÀrib eraldi artikleid, samas pĂ”hiteavet saab lugeda dokumentatsioon.

Probleemi teadvustamine

Kuid me mĂ”istsime, kuigi mitte kohe, et tegime ĂŒhe vea: ei lisanud vĂ”imalust koguda pilte lĂ€bi standardse Dockerfile ja integreerida neid sama rakenduse haldamise infrastruktuuri (st koguda pilte, juurutada ja puhastada neid). Kuidas sai luua tööriista juurutamiseks Kubernetesis ja mitte rakendada Dockerfile'i tuge, st enamikus projektides standaardset meetodit piltide kirjeldamiseks?..

KĂŒsimusele, mida teha, kui teil juba on Dockerfile (vĂ”i komplekt Dockerfile'e) ja soovite kasutada werf, pakume vastust.

NB: Muide, miks ĂŒldse soovite kasutada werf? Peamised funktsioonid on jĂ€rgmised:

  • tĂ€ielik rakenduse haldamise tsĂŒkkel, sealhulgas piltide puhastamine;
  • vĂ”imalus hallata mitme pildi ehitust ĂŒhelt kohalt;
  • parandatud Helmi ĂŒhilduvate chartide juurutamise protsess.

TĂ€ieliku loendi leiate projekti lehel.

Seega, kui varem oleksime soovitanud Dockerfile meie konfigureerimisele ĂŒmber kirjutada, siis nĂŒĂŒd ĂŒtleme heameelega: "Laske werf koguda teie Dockerfile'e!"

Kuidas kasutada?

Selle vĂ”imaluse tĂ€ies ulatuses rakendamine toimus vĂ€ljalaske werf v1.0.3-beta.1. Üldine pĂ”himĂ”te on lihtne: kasutaja mÀÀrab werf konfigureerimises olemasoleva Dockerfile'i tee, seejĂ€rel kĂ€ivitab kĂ€su werf build
 ja kĂ”ik — werf kogub pildi. Vaatame abstraktsel nĂ€itel.

Deklareerime jÀrgmise Dockerfile projekti juures:

FROM ubuntu:18.04
RUN echo Ehitamine ...

Ja deklareerime werf.yaml, mis kasutab seda Dockerfile:

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

KÔik! JÀÀnud on kÀivitada werf build:

Saate nĂŒĂŒd Docker-pilte werf-is ehitada ka tavalise Dockerfile'i abil

Lisaks vÔib deklareerida jÀrgmise werf.yaml nende kogumiseks mitmest Dockerfile'ist:

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

LĂ”puks toetatakse ka tĂ€iendavate kokkupaneku parameetrite edastamist — nagu --build-arg ja --add-host — lĂ€bi werfi konfiguratsiooni. TĂ€ielik Dockerfile pildi konfiguratsiooni kirjeldus on saadaval dokumendi lehelt.

Kuidas see töötab?

Kokkupaneku kÀigus toimib Dockeris standardne kohalike kihtide vahemÀlu. Kuid mis on oluline, on see, et werf integreerib Dockerfile konfiguratsiooni oma infrastruktuuri. Mida see tÀhendab?

  1. Iga pilt, mis on koostatud Dockerfile'ist, koosneb ĂŒhest etapist, mille nimeks on dockerfile (rohkem etappide kohta werfis saab lugeda siin).
  2. Etapi puhul dockerfile werf arvutab signatuuri, mis sÔltub Dockerfile'i konfiguratsiooni sisust. Kui Dockerfile'i konfiguratsioon muutub, siis muutub ka etapi signatuur dockerfile ja werf kÀivitab selle etapi uuesti koostamise uue Dockerfile konfiguratsiooniga. Kui signatuur ei muutu, siis vÔtab werf pildi vahemÀlust (rohkem signatuuride kasutamisest werfis on rÀÀgitud selles ettekandes).
  3. Edasi kokku pandud pilte saab avaldada kĂ€su werf publish (vĂ”i werf build-and-publish) abil ja kasutada Kuberneteses juurutamiseks. Avaldatud pilte Docker Registry's puhastatakse werfi standardsete puhastusmeetoditega, st vanad pildid (ĂŒle N pĂ€eva), pildid, mis on seotud mitteeksisteerivate Git harudega, ja muude poliitikate alusel puhastatakse automaatselt.

Detailsed teavet siin kÀsitletud punktide kohta saab leida dokumendist:

MÀrkused ja ettevaatusabinÔud

1. VĂ€lise URL-i kasutamine ADD-is ei ole toetatud

Praegu ei toeta ADD direktiivis vÀlise URL-i kasutamist. Werf ei kÀivita uuesti koostamist, kui ressurss, millel on nÀidatud URL, muutub. Selle vÔimaluse lisamine on peagi plaanis.2. .git'i pilti lisamine ei ole lubatud

Üldiselt on .git kausta lisamine pildile halb praktika ja siin on, miks:

see jÀÀb lĂ”plikku pilti, see rikub pĂ”himĂ”tteid 12 factor app : kuna lĂ”plik pilt peab olema seotud ĂŒhe commit'iga, ei tohi olla vĂ”imalust teha

  1. Kui 12 factor app git checkout meelevaldse commit'i.see suurendab pildi suurust (repo vÔib olla suur, kuna sinna lisati kunagi suuri faile ja seejÀrel kustutati need). Tööpuu suurus, mis on seotud ainult teatud commit'iga, ei sÔltu Git'i tegevuste ajaloost. Samuti ei saa lisada ja seejÀrel eemaldada. huvilisi. suvaline commit.
  2. 12 factor app suureneb pildi suurus (hoidla vĂ”ib olla suur, kuna sinna on kunagi lisatud suured failid ja hiljem eemaldatud). Siiski ei sĂ”ltu work-tree suurus, mis on seotud ainult kindla commitiga, Git-i toimingute ajaloost. Sellegipoolest, lisamise ja jĂ€rgneva eemaldamisega 12 factor app lĂ”pppildist ei tule midagi: pilt omandab ikkagi lisakiht — nii töötab Docker.
  3. Docker vĂ”ib algatada tarbetuid ĂŒmberkompileerimisi, isegi kui kompileeritakse sama commit'i, kuid erinevatest work-tree'dest. NĂ€iteks, GitLab loob eraldi kloonitud kataloogid /home/gitlab-runner/builds/HASH/[0-N]/yourproject kuid aktiveeritud paralleelse kompileerimise korral. Tarbetu ĂŒmberkompileerimine on seotud sellega, et kataloog 12 factor app erineb ĂŒhe ja sama hoidla erinevates kloonitud versioonides, isegi kui kompileeritakse sama commit.

Viimasel punkt on tagajĂ€rg ka werf'i kasutamisel. Werf nĂ”uab, et kompileeritud cache oleks olemas teatud kĂ€skude tĂ€itmisel (nĂ€iteks, werf deploy). Selliste kĂ€skude tĂ€itmise ajal arvutab werf piltide etappide signatuure, mis on mÀÀratud werf.yaml, ja need peavad olema kompileeritud cache's — muidu ei saa kĂ€sk jĂ€tkata. Kui etappide signatuur sĂ”ltub sisu 12 factor app, siis saame muutustele vastupidava, kuid ebaoluliste failide cache'i, ja werf ei suuda sellist viga andestada (lisaks vaata dokumentatsioon).

Üldiselt ainult teatud vajalike failide lisamine koos kĂ€suga Werf ei kĂ€ivita uuesti koostamist, kui ressurss, millel on nĂ€idatud URL, muutub. Selle vĂ”imaluse lisamine on peagi plaanis. igcase tĂ”stab kirjutatava tĂ”husust ja usaldusvÀÀrsust Dockerfile, ning parandab selle koostatud Dockerfile, cache'i vastupidavust ebaoluliste muutuste suhtes Git'is.

KokkuvÔte

Meie algne tee konkreetsete vajaduste jaoks oma kompilaatori kirjutamisel oli raske, aus ja sirge: standardse Dockerfile'i asemel oleme kirjutanud oma lahenduse, millel on kohandatud sĂŒntaks. Ja see on andnud oma eelised: Stapel-kompilaator teeb oma ĂŒlesande hĂ€sti.

Kuid oma kompilaatori kirjutamise protsessis unustasime olemasolevate Dockerfile'id toetada. NĂŒĂŒd on see puudus parandatud ja tulevikus kavatseme arendada Dockerfile'i toetust koos meie kohandatud Stapel kompilaatoriga hajutatud kompileerimise jaoks ja Kubernetes'i kasutamisel (st kompileerimine runner'ites Kubernetes'is, nagu on tehtud kanikos).

Nii et kui teil Àkki on mÔni Dockerfile vedelemas... proovige werf!

P.S. Dokumentatsiooni nimekiri teemal

Lugege ka meie blogist: „werf — meie tööriist CI/CD jaoks Kuberneteses (ĂŒlevaade ja video ettekandest)».

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster