Aħjar tard milli qatt. Jew kif kważi għamilna żball serju billi ma kellniex appoġġ għal Dockerfiles regolari biex nibnu immaġini tal-applikazzjoni.

Aħna ser nitkellmu dwar — Utilità GitOps li tintegra ma' kwalunkwe sistema CI/CD u tipprovdi ġestjoni taċ-ċiklu tal-ħajja kollu tal-applikazzjoni, li tippermetti:
- tiġbor u tippubblika stampi,
- tuża applikazzjonijiet f'Kubernetes,
- ħassar immaġini mhux użati billi tuża politiki speċjali.
Il-filosofija tal-proġett hija li tiġbor għodod ta 'livell baxx f'sistema unifikata waħda li tagħti lill-inġiniera DevOps kontroll fuq l-applikazzjonijiet. Jekk possibbli, għandhom jintużaw utilitajiet eżistenti (bħal Helm u Docker). Jekk ma jkunx hemm soluzzjoni għal problema, nistgħu noħolqu u nappoġġjaw dak kollu meħtieġ għal dan.
Sfond: il-kollettur tal-immaġni tiegħek stess
Dan huwa dak li ġara mal-kollettur tal-immaġni f'werf: is-soltu Dockerfile ma kienx biżżejjed għalina. Jekk tagħti ħarsa malajr lejn l-istorja tal-proġett, din il-problema dehret diġà fl-ewwel verżjonijiet tal-werf (imbagħad xorta ).
Filwaqt li ħloqna għodda għall-bini ta 'applikazzjonijiet fl-immaġini Docker, malajr indunaw li Dockerfile ma kienx adattat għalina għal xi ħidmiet speċifiċi ħafna:
- Il-ħtieġa li jinbnew applikazzjonijiet żgħar tipiċi tal-web skont l-iskema standard li ġejja:
- tinstalla dipendenzi ta' applikazzjoni mas-sistema kollha,
- tinstalla grupp ta' libreriji ta' dipendenza fuq l-applikazzjoni,
- jiġbru l-assi,
- u l-aktar importanti, aġġorna l-kodiċi fl-immaġni malajr u b'mod effiċjenti.
- Meta jsiru bidliet fil-fajls tal-proġett, il-bennej għandu malajr joħloq saff ġdid billi japplika garża għall-fajls mibdula.
- Jekk ċerti fajls inbidlu, allura huwa meħtieġ li jerġa 'jinbena l-istadju dipendenti korrispondenti.
Illum il-kollettur tagħna għandu ħafna possibbiltajiet oħra, iżda dawn kienu x-xewqat u t-tħeġġiġ inizjali.
B'mod ġenerali, mingħajr ma naħsbu darbtejn, armajna lilna nfusna bil-lingwa ta 'programmar li użajna (ara isfel) u laqat it-triq biex timplimenta DSL stess! Skont l-għanijiet, kien maħsub li jiddeskrivi l-proċess tal-assemblaġġ fi stadji u jiddetermina d-dipendenzi ta 'dawn l-istadji fuq il-fajls. U kkumplimentaha kollettur proprju, li biddel id-DSL fl-għan finali - immaġni immuntata. Għall-ewwel id-DSL kien f'Ruby, iżda bħala — il-konfigurazzjoni tal-kollettur tagħna bdiet tiġi deskritta f'fajl YAML.

Konfigurazzjoni antika għal dapp f'Ruby

Konfigurazzjoni attwali għal werf fuq YAML
Il-mekkaniżmu tal-kollettur inbidel ukoll maż-żmien. Għall-ewwel, aħna sempliċement iġġeneraw Dockerfile temporanju fuq il-fly mill-konfigurazzjoni tagħna, u mbagħad bdejna nħaddmu struzzjonijiet ta 'assemblaġġ f'kontenituri temporanji u nimpenjaw ruħhom.
NB: Fil-mument, il-kollettur tagħna, li jaħdem bil-konfigurazzjoni tiegħu stess (f'YAML) u jissejjaħ il-kollettur Stapel, diġà żviluppa f'għodda pjuttost qawwija. Id-deskrizzjoni dettaljata tagħha jistħoqqilha artikli separati, u d-dettalji bażiċi jistgħu jinstabu fi .
Għarfien tal-problema
Imma indunajna, u mhux immedjatament, li konna għamilna żball wieħed: ma żidniex l-abbiltà tibni immaġini permezz ta 'Dockerfile standard u jintegrahom fl-istess infrastruttura ta’ ġestjoni tal-applikazzjonijiet minn tarf sa tarf (jiġifieri iġbor immaġini, skjerahom u naddafhom). Kif jista 'jkun possibbli li ssir għodda għall-iskjerament f'Kubernetes u ma timplimentax l-appoġġ ta' Dockerfile, i.e. mod standard biex tiddeskrivi l-immaġini għall-biċċa l-kbira tal-proġetti?...
Minflok ma nwieġbu din il-mistoqsija, noffru soluzzjoni. X'jiġri jekk diġà għandek Dockerfile (jew sett ta 'Dockerfiles) u trid tuża werf?
NB: Mill-mod, għaliex kieku inti anki tixtieq tuża werf? Il-karatteristiċi ewlenin jinżlu għal dawn li ġejjin:
- ċiklu sħiħ tal-ġestjoni tal-applikazzjoni inkluż it-tindif tal-immaġni;
- il-ħila li timmaniġġja l-assemblaġġ ta 'diversi immaġini f'daqqa minn konfigurazzjoni waħda;
- Proċess ta' skjerament imtejjeb għal charts kompatibbli ma' Helm.
Lista aktar kompluta minnhom tista' tinstab fuq .
Għalhekk, kieku qabel konna noffru li nikteb mill-ġdid id-Dockerfile fil-konfigurazzjoni tagħna, issa kuntenti ngħidu: "Ħalli werf jibni l-Dockerfiles tiegħek!"
Kif tuża?
L-implimentazzjoni sħiħa ta 'din il-karatteristika dehret fir-rilaxx . Il-prinċipju ġenerali huwa sempliċi: l-utent jispeċifika t-triq għal Dockerfile eżistenti fil-konfigurazzjoni werf, u mbagħad imexxi l-kmand werf build... u dak hu - werf se jiġbor l-immaġni. Ejja nħarsu lejn eżempju astratt.
Ejja nħabbru dak li jmiss Dockerfile fl-għerq tal-proġett:
FROM ubuntu:18.04
RUN echo Building ... U aħna ser inħabbru werf.yamlli juża dan Dockerfile:
configVersion: 1
project: dockerfile-example
---
image: ~
dockerfile: ./Dockerfile Kollha! Xellug ġirja werf build:

Barra minn hekk, tista 'tiddikjara dan li ġej werf.yaml biex tibni diversi immaġini minn Dockerfiles differenti f'daqqa:
configVersion: 1
project: dockerfile-example
---
image: backend
dockerfile: ./dockerfiles/Dockerfile-backend
---
image: frontend
dockerfile: ./dockerfiles/Dockerfile-frontend Fl-aħħarnett, jappoġġja wkoll il-mogħdija ta 'parametri ta' bini addizzjonali, bħal --build-arg и --add-host - permezz tal-konfigurazzjoni werf. Deskrizzjoni sħiħa tal-konfigurazzjoni tal-immaġni Dockerfile hija disponibbli fuq .
Kif taħdem?
Matul il-proċess tal-bini, il-cache standard tas-saffi lokali fid-Docker jiffunzjona. Madankollu, dak li huwa importanti huwa li werf ukoll jintegra l-konfigurazzjoni ta 'Dockerfile fl-infrastruttura tiegħu. Xi jfisser dan?
- Kull immaġini mibnija minn Dockerfile tikkonsisti fi stadju wieħed imsejjaħ
dockerfile(tista 'taqra aktar dwar liema stadji huma fil-werf ). - Għall-istadju
dockerfilewerf jikkalkula firma li tiddependi fuq il-kontenut tal-konfigurazzjoni Dockerfile. Meta l-konfigurazzjoni Dockerfile tinbidel, il-firma tal-istadju tinbideldockerfileu werf jibda bini mill-ġdid ta 'dan l-istadju b'konfigurazzjoni ġdida ta' Dockerfile. Jekk il-firma ma tinbidilx, allura werf jieħu l-immaġni mill-cache (aktar dettalji dwar l-użu tal-firem fil-werf ġew deskritti fi ). - Sussegwentement, l-immaġini miġbura jistgħu jiġu ppubblikati bil-kmand
werf publish(Jewwerf build-and-publish) u użah għall-iskjerament fil-Kubernetes. Immaġini ppubblikati fir-Reġistru Docker se jitnaddfu bl-użu ta 'għodod standard ta' tindif tal-werf, i.e. Immaġini antiki (aktar minn N ijiem), immaġini assoċjati ma 'fergħat Git ineżistenti, u politiki oħra se jitnaddfu awtomatikament.
Aktar dettalji dwar il-punti deskritti hawn jistgħu jinstabu fid-dokumentazzjoni:
- ;
- ;
- .
Noti u prekawzjonijiet
1. URL estern mhuwiex appoġġjat fl-ADD
Bħalissa mhux appoġġjat li tuża URL estern f'direttiva ADD. Werf mhux se jibda bini mill-ġdid meta r-riżors fl-URL speċifikat jinbidel. Qed nippjanaw li nżidu din il-karatteristika dalwaqt.
2. Ma tistax iżżid .git mal-immaġni
B'mod ġenerali, iż-żieda ta 'direttorju .git fl-immaġini - prattika ħażina vizzjuża u hawn għaliex:
- Jekk
.gitjibqa 'fl-immaġni finali, dan jikser il-prinċipji : Peress li l-immaġni finali trid tkun marbuta ma' impenn wieħed, m'għandux ikun possibbli li jsirgit checkoutimpenn arbitrarju. -
.gitiżid id-daqs tal-immaġini (ir-repożitorju jista 'jkun kbir minħabba l-fatt li fajls kbar darba ġew miżjuda magħha u mbagħad imħassra). Id-daqs ta 'siġra tax-xogħol assoċjata biss ma' impenn speċifiku mhux se jiddependi fuq l-istorja tal-operazzjonijiet f'Git. F'dan il-każ, iż-żieda u t-tneħħija sussegwenti.gitmill-immaġni finali mhux se taħdem: l-immaġni xorta se tikseb saff żejjed - hekk jaħdem Docker. - Docker jista 'jibda bini mill-ġdid bla bżonn, anke jekk l-istess impenn qed jinbena, iżda minn siġar tax-xogħol differenti. Pereżempju, GitLab joħloq direttorji kklonati separati fi
/home/gitlab-runner/builds/HASH/[0-N]/yourprojectmeta l-assemblaġġ parallel ikun attivat. L-assemblaġġ mill-ġdid żejda se jkun minħabba l-fatt li d-direttorju.githija differenti f'verżjonijiet klonati differenti tal-istess repożitorju, anki jekk jinbena l-istess commit.
L-aħħar punt għandu wkoll konsegwenzi meta tuża werf. Werf jeħtieġ li l-cache mibnija tkun preżenti meta tmexxi xi kmandi (eż. werf deploy). Meta dawn il-kmandi jitħaddmu, werf jikkalkula l-firem tal-istadju għall-immaġini speċifikati fi werf.yaml, u għandhom ikunu fil-cache tal-assemblaġġ - inkella l-kmand ma jkunx jista 'jkompli jaħdem. Jekk il-firma tal-istadju tiddependi fuq il-kontenut .git, allura jkollna cache li hija instabbli għal bidliet f'fajls irrilevanti, u werf mhux se jkun jista' jaħfer tali sorveljanza (għal aktar dettalji, ara ).
B'mod ġenerali iżżid biss ċerti fajls meħtieġa permezz tal-istruzzjonijiet ADD fi kwalunkwe każ iżid l-effiċjenza u l-affidabbiltà tal-miktub Dockerfile, u jtejjeb ukoll l-istabbiltà tal-cache miġbura għal dan Dockerfile, għal bidliet irrilevanti f'Git.
Total
It-triq inizjali tagħna biex niktbu l-bennej tagħna stess għal bżonnijiet speċifiċi kienet iebsa, onesta u sempliċi: minflok ma nużaw krozzi fuq il-Dockerfile standard, ktibna s-soluzzjoni tagħna b'sintassi personalizzata. U dan kellu l-vantaġġi tiegħu: il-kollettur Stapel ilaħħaq mal-kompitu tiegħu perfettament.
Madankollu, fil-proċess tal-kitba tal-bennej tagħna stess, tlifna l-appoġġ għal Dockerfiles eżistenti. Dan id-difett issa ġie rranġat, u fil-futur qed nippjanaw li niżviluppaw l-appoġġ għal Dockerfile flimkien mal-bennej Stapel personalizzat tagħna għal bini mqassam u għal bini li juża Kubernetes (jiġifieri jibni fuq runners ġewwa Kubernetes, kif isir fil-kaniko).
Allura, jekk f'daqqa waħda jkollok koppja ta 'Dockerfiles mimduda madwar... ipprova !
PS Lista ta 'dokumentazzjoni dwar is-suġġett
- ;
- ;
- ;
- ;
- ;
- ;
- .
Aqra wkoll fil-blog tagħna: “".
Sors: www.habr.com
