Issa tista 'tibni immaġini Docker f'werf billi tuża Dockerfile regolari

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.

Issa tista 'tibni immaġini Docker f'werf billi tuża Dockerfile regolari

Aħna ser nitkellmu dwar werf — 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 magħrufa bħala dapp).

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:

  1. 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.
  2. 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.
  3. 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 transizzjoni lejn Golang — il-konfigurazzjoni tal-kollettur tagħna bdiet tiġi deskritta f'fajl YAML.

Issa tista 'tibni immaġini Docker f'werf billi tuża Dockerfile regolari
Konfigurazzjoni antika għal dapp f'Ruby

Issa tista 'tibni immaġini Docker f'werf billi tuża Dockerfile regolari
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 dokumentazzjoni.

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 paġna tal-proġett.

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 werf v1.0.3-beta.1. 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:

Issa tista 'tibni immaġini Docker f'werf billi tuża Dockerfile regolari

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 paġna tad-dokumentazzjoni.

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?

  1. Kull immaġini mibnija minn Dockerfile tikkonsisti fi stadju wieħed imsejjaħ dockerfile (tista 'taqra aktar dwar liema stadji huma fil-werf hawn).
  2. Għall-istadju dockerfile werf jikkalkula firma li tiddependi fuq il-kontenut tal-konfigurazzjoni Dockerfile. Meta l-konfigurazzjoni Dockerfile tinbidel, il-firma tal-istadju tinbidel dockerfile u 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 dan ir-rapport).
  3. Sussegwentement, l-immaġini miġbura jistgħu jiġu ppubblikati bil-kmand werf publish (Jew werf 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:

  1. Jekk .git jibqa 'fl-immaġni finali, dan jikser il-prinċipji 12-il fattur app: Peress li l-immaġni finali trid tkun marbuta ma' impenn wieħed, m'għandux ikun possibbli li jsir git checkout impenn arbitrarju.
  2. .git iż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 .git mill-immaġni finali mhux se taħdem: l-immaġni xorta se tikseb saff żejjed - hekk jaħdem Docker.
  3. 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]/yourproject meta l-assemblaġġ parallel ikun attivat. L-assemblaġġ mill-ġdid żejda se jkun minħabba l-fatt li d-direttorju .git hija 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 dokumentazzjoni).

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 werf!

PS Lista ta 'dokumentazzjoni dwar is-suġġett

Aqra wkoll fil-blog tagħna: “werf - l-għodda tagħna għal CI / CD f'Kubernetes (ħarsa ġenerali u rapport tal-vidjo)".

Sors: www.habr.com

Żid kumment