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.

RÀÀgime â 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 ).
Loo rakenduste koostamise tööriista Docker-piltide jaoks, mĂ”istsime kiiresti, et Dockerfile ei sobi meile mĂ”ningate konkreetsete ĂŒlesannete jaoks:
- 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.
- Projektifailide muutumisel peab koostaja kiiresti looma uue kihi, rakendades muudatusi muudetud failidele.
- 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 kogumishalduri konfiguratsioon hakkab olema kirjas YAML-failis.

Vana konfiguraator dapp Ruby jaoks

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 .
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 .
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 . Ă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:

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 .
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?
- Iga pilt, mis on koostatud Dockerfile'ist, koosneb ĂŒhest etapist, mille nimeks on
dockerfile(rohkem etappide kohta werfis saab lugeda ). - Etapi puhul
dockerfilewerf arvutab signatuuri, mis sÔltub Dockerfile'i konfiguratsiooni sisust. Kui Dockerfile'i konfiguratsioon muutub, siis muutub ka etapi signatuurdockerfileja 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 ). - Edasi kokku pandud pilte saab avaldada kÀsu
werf publish(vĂ”iwerf 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
- Kui
12 factor appgit checkout 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. -
12 factor appsuureneb 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 eemaldamisega12 factor applĂ”pppildist ei tule midagi: pilt omandab ikkagi lisakiht â nii töötab Docker. - 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]/yourprojectkuid aktiveeritud paralleelse kompileerimise korral. Tarbetu ĂŒmberkompileerimine on seotud sellega, et kataloog12 factor apperineb ĂŒ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 ).
Ă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 !
P.S. Dokumentatsiooni nimekiri teemal
- ;
- ;
- ;
- ;
- ;
- ;
- .
Lugege ka meie blogist: â».
Allikas: habr.com
