Tani është e mundur të ndërtosh imazhe Docker në werf edhe përmes Dockerfile standard

Më mirë vonë sesa kurrë. Ose si pothuajse bëmë një gabim të rëndë, pa pasur mbështetje për Dockerfiles të zakonshme për ndërtimin e imazheve të aplikacioneve.

Tani është e mundur të ndërtosh imazhe Docker në werf edhe përmes Dockerfile standard

Ky artikull do tĂ« flasĂ« pĂ«r werf — njĂ« mjet GitOps, i cili integrot me çdo sistem CI/CD dhe siguron menaxhim tĂ« tĂ«rĂ« ciklit tĂ« jetĂ«s sĂ« aplikacionit, duke lejuar:

  • tĂ« ndĂ«rtojnĂ« dhe publikojnĂ« imazhe,
  • tĂ« vendosin aplikacione nĂ« Kubernetes,
  • tĂ« fshijnĂ« imazhet e panevojshme me ndihmĂ«n e politikave tĂ« veçanta.


Filozofia e projektit është të mblidhen mjete të nivelit të ulët në një sistem të unifikuar, duke i dhënë inxhinierëve DevOps kontroll mbi aplikacionet. Sipas mundësisë, duhet të përfshihen mjete ekzistuese (si Helm dhe Docker). Nëse nuk ka një zgjidhje për ndonjë problem, ne mund të krijojmë dhe mbështesim gjithçka të nevojshme për këtë.

Historia: ndërtuesi ynë i imazheve

Kështu ndodhi me ndërtuesin e imazheve në werf: na mungonte Dockerfile i zakonshëm. Nëse shikojmë shpejt në historinë e projektit, ky problem u shfaq qysh në versionet e para të werf (atëherë ende i njohur si dapp).

Duke krijuar një mjet për ndërtimin e aplikacioneve në imazhe Docker, shpejt e kuptuam se Dockerfile nuk na përshtatet për disa detyra të caktuara:

  1. Nevoja për të ndërtuar aplikacione të vogla web sipas një skeme standarde:
    • tĂ« instaloni varĂ«sitĂ« e sistemit tĂ« zakonshĂ«m tĂ« aplikacionit,
    • tĂ« instaloni bundle tĂ« bibliotekave tĂ« varĂ«sive tĂ« aplikacionit,
    • tĂ« ndĂ«rtoni asetet,
    • dhe mĂ« e rĂ«ndĂ«sishmja — tĂ« pĂ«rditĂ«soni kodin nĂ« imazh shpejt dhe nĂ« mĂ«nyrĂ« efikase.
  2. Kur ndodhin ndryshime në skedarët e projektit, ndërtuesi duhet të krijojë shpejt një shtresë të re duke vendosur patches në skedarët e ndryshuar.
  3. Nëse ndryshojnë skedarë të caktuar, është e nevojshme të rine ndërroni fazën përkatëse të varësisë.

Sot, ndërtuesi ynë ka gjithashtu shumë mundësi të tjera, por dëshirat dhe nxitjet fillestare ishin të tilla.

PĂ«r tĂ« thĂ«nĂ« tĂ« drejtĂ«n, ne morĂ«m nĂ« dorĂ« gjuhĂ«n e programimit tĂ« pĂ«rdorur (shih mĂ« poshtĂ«) dhe u nisĂ«m drejt realizimit tĂ« DSL tonĂ«! Duke u pĂ«rputhur me detyrat e caktuara, ai ishte i destinuar pĂ«r tĂ« pĂ«rshkruar procesin e ndĂ«rtimit nĂ«pĂ«r faza dhe pĂ«r tĂ« pĂ«rcaktuar varĂ«sitĂ« e kĂ«tyre fazave nga skedarĂ«t. Dhe e plotĂ«sonte atĂ« ndĂ«rtuesi ynĂ«, i cili e kthente DSL nĂ« objektin pĂ«rfundimtar — imazhin e ndĂ«rtuar. NĂ« fillim, DSL ishte nĂ« Ruby, dhe me kalimin nĂ« Golang — konfigurimi ynĂ« i ndĂ«rtuesit filloi tĂ« pĂ«rshkruhej nĂ« njĂ« skedar YAML.

Tani është e mundur të ndërtosh imazhe Docker në werf edhe përmes Dockerfile standard
Konfigurimi i vjetshëm për dapp në Ruby

Tani është e mundur të ndërtosh imazhe Docker në werf edhe përmes Dockerfile standard
Konfigurimi aktual për werf në YAML

Mekanizmi i punës së ndërtuesit gjithashtu ndryshoi me kalimin e kohës. Fillimisht, ne thjesht gjeneronim në flakë një Dockerfile të përkohshëm nga konfigurimi ynë, dhe pastaj filluam të ekzekutonim udhëzime ndërtimi në kontejnerë të përkohshëm dhe të bënim commit.

NB: Aktualisht, ndërtuesi ynë, i cili punon me konfigurimin e tij (në YAML) dhe quhet ndërtuesi Stapel, ka evoluar në një mjet mjaft të fuqishëm. Përshkrimi i tij tërësor meriton artikuj të veçantë, dhe detajet kryesore mund të merren nga dokumentacion.

E kuptuar si problem

Por ne e kuptuam, dhe jo menjëherë, se bëmë një gabim: nuk shtuam mundësinë për të ndërtuar imazhe përmes Dockerfile standard dhe për ta integruar në të njëjtën infrastrukturë të menaxhimit të aplikacioneve (dmth. për të ndërtuar imazhe, për të bërë deploy dhe për t'i pastruar). Si mund të krijojmë një mjet për deploy në Kubernetes dhe të mos realizojmë mbështetje për Dockerfile, dmth. mënyra standarde për ta përshkruar imazhet për shumicën e projekteve?..

NĂ« vend tĂ« pĂ«rgjigjes pĂ«r njĂ« pyetje tĂ« tillĂ«, ne ofrojmĂ« zgjidhjen e saj. ÇfarĂ« duhet tĂ« bĂ«ni, nĂ«se tashmĂ« keni njĂ« Dockerfile (ose njĂ« grup Dockerfile’ash) dhe dĂ«shironi tĂ« pĂ«rdorni werf?

NB: Për të thënë të vërtetën, pse do të dëshironit të përdorni werf? Tiparet kryesore janë si më poshtë:

  • cikli i plotĂ« i menaxhimit tĂ« aplikacionit, duke pĂ«rfshirĂ« pastrimin e imazheve;
  • mundĂ«sia pĂ«r tĂ« menaxhuar ndĂ«rtimin e disa imazheve nga njĂ« konfigurim tĂ« vetme;
  • procesi i pĂ«rmirĂ«suar i deploy tĂ« chart-eve, tĂ« cilat janĂ« pĂ«rputhĂ«se me Helm.

Me një listë më të plotë të tyre mund të njoheni në faqen e projektit.

Pra, nëse më parë ne do të kishim propozuar që ta rishkruanim Dockerfile në konfigurimin tonë, tani me kënaqësi do të themi: «Lejoni werf të ndërtojë Dockerfile tuaj!»

Si ta përdor?

Implementimi i plotĂ« i kĂ«saj mundĂ«sie u shfaq nĂ« versionin werf v1.0.3-beta.1. Parimi i pĂ«rgjithshĂ«m Ă«shtĂ« i thjeshtĂ«: pĂ«rdoruesi specifikon rrugĂ«n deri te Dockerfile ekzistues nĂ« konfigurimin werf, pas sĂ« cilĂ«s ekzekuton komandĂ«n werf build
 dhe gjithçka — werf do ta ndĂ«rtojĂ« imazhin. Le ta shqyrtojmĂ« nĂ« njĂ« shembull abstrakt.

Deklarojmë si më poshtë Dockerfile në rrënjën e projektit:

FROM ubuntu:18.04
RUN echo Building ...

Dhe deklarojmë werf.yaml, i cili përdor këtë Dockerfile:

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

E gjithë! Qëndron vetëm të fillojnë werf build:

Tani është e mundur të ndërtosh imazhe Docker në werf edhe përmes Dockerfile standard

Për më tepër, mund të deklaroni si më poshtë werf.yaml për të ndërtuar menjëherë disa imazhe nga Dockerfile të ndryshme:

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

MĂ« nĂ« fund, mbĂ«shtetet edhe kalimi i parametrave shtesĂ« tĂ« ndĂ«rtimit — siç janĂ« --build-arg dhe --add-host — pĂ«rmes konfigurations werf. NjĂ« pĂ«rshkrim i plotĂ« i konfigurimit tĂ« imazhit Dockerfile Ă«shtĂ« i disponueshĂ«m nĂ« faqen e dokumentacionit.

Si funksionon?

GjatĂ« procesit tĂ« ndĂ«rtimit funksionon cache standard i slojve lokale nĂ« Docker. MegjithatĂ«, e rĂ«ndĂ«sishme Ă«shtĂ« qĂ« werf gjithashtu integron konfigurimin e Dockerfile nĂ« infrastrukturĂ«n e saj. ÇfarĂ« do tĂ« thotĂ« kjo?

  1. Çdo imazh i ndĂ«rtuar nga Dockerfile pĂ«rbĂ«het nga njĂ« stad i njohur si dockerfile (mĂ« shumĂ« rreth asaj qĂ« janĂ« stadi nĂ« werf, mund tĂ« lexoni kĂ«tu).
  2. Për stadi-n dockerfile werf llogarit një nënshkrim, i cili varet nga përmbajtja e konfigurimit të Dockerfile. Kur ndodhin ndryshime në konfigurimin e Dockerfile, nënshkrimi i stages ndryshon dockerfile dhe werf nismon rine ndërtimin e këtij stadi me një konfigurim të ri të Dockerfile. Nëse nënshkrimi nuk ndryshon, atëherë werf merr imazhin nga cache (më shumë për përdorimin e nënshkrimeve në werf është folur në këtë raport).
  3. Më pas, imazhet e ndërtuara mund të publikohen me komandën werf publish (ose werf build-and-publish) dhe të përdoren për ndërrim në Kubernetes. Imazhet e publikuara në Docker Registry do të pastrohen me mjetet standarde të pastrimit të werf, dmth. do të ketë pastrim automatik të imazheve të vjetra (më të vjetra se N ditë), imazheve që lidhen me dega të paekzistuese Git, dhe sipas politikave të tjera.

Më shumë për momentet e përshkruara këtu mund të mësoni nga dokumentacioni:

Shënime dhe masa paraprake

1. URL e jashtme në ADD nuk mbështetet

Aktualisht nuk mbështetet përdorimi i një URL-je të jashtme në direktivën ADD. Werf nuk do të nismojë rine ndërtimin në rast të ndryshimit të burimit në URL-në e dhënë. Në një të ardhme të afërt planifikohet shtimi i kësaj mundësie.

2. Nuk lejohet shtimi i .git në imazh

Në përgjithësi, shtimi i drejtorisë .git në imazh është një praktikë e keqe dhe ja pse:

  1. Nëse .git mbetet në imazhin përfundimtar, kjo cënon parimet 12 factor app: sepse imazhi përfundimtar duhet të lidhet me një commit të vetëm, nuk duhet të ketë mundësi për të bërë git checkout commit të rastësishëm.
  2. .git rrit madhĂ«sinĂ« e imazhit (repoja mund tĂ« jetĂ« e madhe pĂ«r shkak se njĂ«herĂ« janĂ« shtuar skedarĂ« tĂ« mĂ«dhenj dhe pastaj janĂ« fshirĂ«). MadhĂ«sia e work-tree, e lidhur vetĂ«m me njĂ« commit tĂ« caktuar, nuk do tĂ« varet nga historia e operacioneve nĂ« Git. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, shtimi dhe fshirja e mĂ«passhme .git nga imazhi pĂ«rfundimtar nuk do tĂ« funksionojĂ«: imazhi do tĂ« fitojĂ« njĂ« shtresĂ« tĂ« tepĂ«rt — kĂ«shtu funksionon Docker.
  3. Docker mund të nismojë rine ndërtim të panevojshëm, edhe nëse po ndodhet ndërtimi i njëjti commit, por nga work-tree të ndryshme. Për shembull, GitLab krijon drejtoritë e klonuara të veçanta /home/gitlab-runner/builds/HASH/[0-N]/yourproject me ndihmën e ndërtimit paralel. Rine ndërtimi i panevojshëm do të jetë i lidhur me faktin se direttoria .git nuk është e njëjtë në versionet e ndryshme të klonuara të të njëjtit repozitor, edhe nëse po ndodhet ndërtimi i njëjti commit.

Pika e fundit ka pasoja edhe kur pĂ«rdoret werf. Werf kĂ«rkon qĂ« cache i ndĂ«rtuar tĂ« jetĂ« i pranishĂ«m gjatĂ« ekzekutimit tĂ« disa komandove (p.sh., werf deploy). GjatĂ« punĂ«s sĂ« kĂ«tyre komandave, werf llogarit nĂ«nshkrimet e stadeve pĂ«r imazhet e specifikuara nĂ« werf.yaml, dhe ato duhet tĂ« jenĂ« nĂ« cache-in e ndĂ«rtimit — ndryshe komanda nuk do tĂ« mund tĂ« vazhdojĂ«. NĂ«se nĂ«nshkrimi i stadi do tĂ« varet nga pĂ«rmbajtja .git, atĂ«herĂ« ne do tĂ« kemi njĂ« cache tĂ« paqĂ«ndrueshĂ«m ndaj ndryshimeve nĂ« skedarĂ«t e panesĂ«rishĂ«m dhe werf nuk do tĂ« mund ta falĂ« njĂ« gabim tĂ« tillĂ« (mĂ« shumĂ« shih nĂ« dokumentacion).

Në përgjithësi shtimin e vetëm të skedarëve të nevojshëm përmes direktivës ADD në çdo rast rrit efikasitetin dhe besueshmërinë e asaj që është shkruar Dockerfile, si dhe përmirëson stabilitetin e cache-it, të ndërtuar sipas kësaj Dockerfile, ndaj ndryshimeve të panevojshme në Git.

Përfundimi

Rruga jonë fillestare me shkruarjen e ndërtuesit tonë për nevoja të caktuara ishte e vështirë, e sinqertë dhe e drejtpërdrejtë: në vend që të përdornim qershi mbi standardin Dockerfile ne shkruam zgjidhjen tonë me sintaksë të personalizuar. Dhe kjo dha përfitime të saj: ndërtuesi Stapel bën përshpejt një punë të shkëlqyer.

Megjithatë, gjatë procesit të shkruarjes së ndërtuesit tonë ne humbëm mbështetje për Dockerfile-të ekzistuese. Tani ky defekt është korrigjuar, dhe në të ardhmen planifikojmë të zhvillojmë mbështetje për Dockerfile përveç ndërtuesit tonë të personalizuar Stapel për ndërtim të shpërndarë dhe për ndërtim që përdor Kubernetes (p.sh., ndërtimi në runner brenda Kubernetes, ashtu siç është bërë në kaniko).

Prandaj, nëse ndonjëherë keni disa Dockerfile të ndodhur... provojeni werf!

P.S. Lista e dokumentacionit për këtë temë

Lexoni gjithashtu nĂ« blogun tonĂ«: «werf — mjeti ynĂ« pĂ«r CI/CD nĂ« Kubernetes (pĂ«rmbledhje dhe video kĂ«rkese)».

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster