Ou kapab kounye a bati imaj Docker nan werf lè l sèvi avèk yon Dockerfile regilye

Li pi bon an reta pase pa janm. Oswa ki jan nou prèske fè yon erè grav lè nou pa gen sipò pou Dockerfiles regilye yo bati imaj aplikasyon an.

Ou kapab kounye a bati imaj Docker nan werf lè l sèvi avèk yon Dockerfile regilye

Nou pral pale de werf — GitOps sèvis piblik ki entegre ak nenpòt sistèm CI/CD epi ki bay jesyon tout sik lavi aplikasyon an, ki pèmèt:

  • kolekte epi pibliye imaj,
  • deplwaye aplikasyon nan Kubernetes,
  • efase imaj ki pa itilize lè l sèvi avèk règleman espesyal.


Filozofi pwojè a se kolekte zouti ki ba nan yon sèl sistèm inifye ki bay enjenyè DevOps kontwòl sou aplikasyon yo. Si sa posib, yo ta dwe itilize sèvis piblik ki egziste deja yo (tankou Helm ak Docker). Si pa gen solisyon pou yon pwoblèm, nou ka kreye ak sipòte tout sa ki nesesè pou sa.

Jan nou koumanse: pèseptè pwòp imaj ou

Sa a se sa ki te pase ak pèseptè a imaj nan werf: Dockerfile abityèl la pa t 'ase pou nou. Si ou pran yon gade rapid nan istwa a nan pwojè a, pwoblèm sa a parèt deja nan premye vèsyon yo nan werf (Lè sa a, toujou ke yo rekonèt kòm dapp).

Pandan n ap kreye yon zouti pou bati aplikasyon nan imaj Docker, nou te byen vit reyalize ke Dockerfile pa t apwopriye pou nou pou kèk travay trè espesifik:

  1. Bezwen pou konstwi aplikasyon tipik ti entènèt selon konplo estanda sa a:
    • enstale depandans aplikasyon pou tout sistèm,
    • enstale yon pakèt bibliyotèk depandans aplikasyon,
    • kolekte byen,
    • ak sa ki pi enpòtan, mete ajou kòd la nan imaj la byen vit ak efikasite.
  2. Lè yo fè chanjman nan dosye pwojè yo, mason an dwe byen vit kreye yon nouvo kouch lè li aplike yon plak nan dosye ki chanje yo.
  3. Si sèten fichye yo chanje, li nesesè pou rebati etap depandan ki koresponn lan.

Jodi a pèseptè nou an gen anpil lòt posiblite, men sa yo te premye dezi ak ankouraje.

An jeneral, san reflechi de fwa, nou ame tèt nou ak langaj pwogramasyon nou te itilize a (gade anba a) epi frape wout la pou aplike pwòp DSL! An akò ak objektif yo, li te gen entansyon dekri pwosesis asanble a an etap epi detèmine depandans etap sa yo sou dosye yo. Ak konplete li pwòp pèseptè, ki te tounen DSL la nan objektif final la - yon imaj reyini. Nan premye DSL la te nan Ruby, men kòm tranzisyon pou Golang — konfigirasyon pèseptè nou an te kòmanse dekri nan yon dosye YAML.

Ou kapab kounye a bati imaj Docker nan werf lè l sèvi avèk yon Dockerfile regilye
Ansyen konfigirasyon pou dapp nan Ruby

Ou kapab kounye a bati imaj Docker nan werf lè l sèvi avèk yon Dockerfile regilye
Konfigirasyon aktyèl pou werf sou YAML

Mekanis nan pèseptè a tou chanje sou tan. Okòmansman, nou tou senpleman te pwodwi yon Dockerfile tanporè sou vole nan konfigirasyon nou an, ak Lè sa a, nou te kòmanse kouri enstriksyon asanble nan resipyan tanporè ak komèt.

NB: Nan moman sa a, pèseptè nou an, ki travay ak konfigirasyon pwòp li yo (nan YAML) epi yo rele pèseptè a Stapel, te deja devlope nan yon zouti san patipri pwisan. Deskripsyon detaye li yo merite atik separe, epi detay debaz yo ka jwenn nan dokiman.

Konsyantizasyon pwoblèm nan

Men, nou reyalize, epi yo pa imedyatman, ke nou te fè yon erè: nou pa ajoute kapasite nan bati imaj atravè Dockerfile estanda epi entegre yo nan menm enfrastrikti jesyon aplikasyon bout-a-fen (sa vle di kolekte imaj, deplwaye ak netwaye yo). Ki jan li ta ka posib fè yon zouti pou deplwaman nan Kubernetes epi yo pa aplike sipò Dockerfile, i.e. fason estanda pou dekri imaj pou pifò pwojè yo?...

Olye pou nou reponn kesyon sa a, nou ofri yon solisyon. E si ou deja gen yon Dockerfile (oswa yon seri Dockerfiles) epi ou vle itilize werf?

NB: By the way, poukisa ou ta menm vle sèvi ak werf? Karakteristik prensipal yo desann nan bagay sa yo:

  • sik jesyon aplikasyon konplè ki gen ladan netwayaj imaj;
  • kapasite nan jere asanble a nan plizyè imaj nan yon fwa soti nan yon konfigirasyon sèl;
  • Pwosesis deplwaman amelyore pou tablo Helm-konpatib.

Ou ka jwenn yon lis pi konplè sou yo nan paj pwojè a.

Se konsa, si pi bonè nou ta ofri reekri Dockerfile a nan konfigirasyon nou an, kounye a nou pral kontan di: "Kite werf bati Dockerfile ou yo!"

Kouman pou itilize?

Aplikasyon konplè karakteristik sa a parèt nan lage a werf v1.0.3-beta.1. Prensip jeneral la se senp: itilizatè a espesifye chemen an nan yon Dockerfile ki deja egziste nan konfigirasyon werf la, ak Lè sa a, kouri lòd la. werf build... e se li - werf pral rasanble imaj la. Ann gade nan yon egzanp abstrè.

Ann anonse pwochen an Dockerfile nan rasin pwojè a:

FROM ubuntu:18.04
RUN echo Building ...

Epi nou pral anonse werf.yamlki sèvi ak sa a Dockerfile:

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

Tout! Goch kouri werf build:

Ou kapab kounye a bati imaj Docker nan werf lè l sèvi avèk yon Dockerfile regilye

Anplis de sa, ou ka deklare sa ki annapre yo werf.yaml pou konstwi plizyè imaj ki soti nan diferan Dockerfiles alafwa:

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

Finalman, li sipòte tou pase lòt paramèt bati, tankou --build-arg и --add-host - atravè werf konfigirasyon. Yon deskripsyon konplè sou konfigirasyon imaj Dockerfile disponib nan paj dokimantasyon.

Kouman li travay?

Pandan pwosesis konstriksyon an, kachèt estanda kouch lokal yo nan Docker fonksyon. Sepandan, sa ki enpòtan se ke werf tou entegre konfigirasyon Dockerfile nan enfrastrikti li yo. Ki sa sa a vle di?

  1. Chak imaj bati nan yon Dockerfile konsiste de yon etap ki rele dockerfile (ou ka li plis sou ki etap yo nan werf isit la).
  2. Pou etap dockerfile werf kalkile yon siyati ki depann de sa ki nan konfigirasyon Dockerfile. Lè konfigirasyon Dockerfile chanje, siyati etap la chanje dockerfile ak werf inisye yon rekonstriksyon etap sa a ak yon nouvo konfigirasyon Dockerfile. Si siyati a pa chanje, lè sa a werf pran imaj la nan kachèt la (yo te dekri plis detay sou itilizasyon siyati nan werf nan rapò sa a).
  3. Apre sa, imaj yo kolekte yo ka pibliye ak lòd la werf publish (Oswa werf build-and-publish) epi sèvi ak li pou deplwaman nan Kubernetes. Imaj ki pibliye nan Rejis Docker yo pral netwaye lè l sèvi avèk zouti netwayaj werf estanda, i.e. Ansyen imaj (ki gen plis pase N jou), imaj ki asosye ak branch Git ki pa egziste, ak lòt politik yo pral otomatikman netwaye.

Ou ka jwenn plis detay sou pwen ki dekri isit la nan dokiman an:

Nòt ak prekosyon

1. URL ekstèn pa sipòte nan ADD

Kounye a li pa sipòte yo sèvi ak yon URL ekstèn nan yon direktiv ADD. Werf pa pral kòmanse yon rebati lè resous ki nan URL espesifye a chanje. Nou planifye ajoute karakteristik sa a byento.

2. Ou pa ka ajoute .git nan imaj la

Anjeneral pale, ajoute yon anyè .git nan imaj la - yon move pratik visye ak isit la poukisa:

  1. Si .git rete nan imaj final la, sa a vyole prensip yo 12 faktè aplikasyon: Depi imaj final la dwe lye nan yon sèl komèt, li pa ta dwe posib fè git checkout komèt abitrè.
  2. .git ogmante gwosè a nan imaj la (repozitwa a ka gwo akòz lefèt ke gwo dosye yo te yon fwa ajoute nan li ak Lè sa a, efase). Gwosè yon pye bwa travay ki asosye sèlman ak yon komite espesifik pa pral depann de istwa operasyon yo nan Git. Nan ka sa a, adisyon a ak retire ki vin apre .git soti nan imaj final la pa pral travay: imaj la ap toujou jwenn yon kouch siplemantè - sa a se ki jan Docker travay.
  3. Docker ka kòmanse yon rekonstriksyon ki pa nesesè, menm si se menm komite a ke yo te bati, men soti nan diferan travay-pyebwa. Pou egzanp, GitLab kreye anyè klonaj separe nan /home/gitlab-runner/builds/HASH/[0-N]/yourproject lè asanble paralèl pèmèt. Resanblaj siplemantè a pral akòz lefèt ke anyè a .git se diferan nan diferan vèsyon klonaj nan menm repozitwa a, menm si se menm komite a bati.

Dènye pwen an tou gen konsekans lè w ap itilize werf. Werf mande pou kachèt bati a prezan lè w ap kouri kèk kòmandman (egzanp. werf deploy). Lè kòmandman sa yo kouri, werf kalkile siyati etap pou imaj yo espesifye nan werf.yaml, epi yo dwe nan kachèt asanble a - otreman kòmandman an pa pral kapab kontinye travay. Si siyati etap la depann de kontni an .git, Lè sa a, nou jwenn yon kachèt ki enstab nan chanjman nan dosye ki pa enpòtan, epi werf pa pral kapab padonnen yon sipèvizyon konsa (pou plis detay, gade dokiman).

An jeneral ajoute sèlman sèten dosye ki nesesè yo atravè enstriksyon yo ADD nan nenpòt ka ogmante efikasite ak fyab nan ekri a Dockerfile, epi tou amelyore estabilite nan kachèt la kolekte pou sa a Dockerfile, nan chanjman ki pa enpòtan nan Git.

Total

Premye chemen nou pou n ekri pwòp mason pa nou pou bezwen espesifik yo te difisil, onèt ak senp: olye pou yo itilize beki sou tèt Dockerfile estanda a, nou te ekri solisyon nou an ak sentaks koutim. Lè sa a te gen avantaj li yo: pèseptè a Stapel fè fas ak travay li parfe.

Sepandan, nan pwosesis la nan ekri pwòp mason nou an, nou pèdi je sipò pou Dockerfiles ki deja egziste. Defo sa a kounye a te ranje, epi nan lavni an nou planifye pou devlope sipò Dockerfile ansanm ak builder Stapel koutim nou an pou asanble distribiye ak pou asanble lè l sèvi avèk Kubernetes (sa vle di asanble sou kourè andedan Kubernetes, jan sa fèt nan kaniko).

Se konsa, si toudenkou ou gen yon koup nan Dockerfiles kouche alantou ... eseye werf!

PS Lis dokimantasyon sou sijè a

Li tou nan blog nou an: "werf - zouti nou an pou CI / CD nan Kubernetes (apèsi sou lekòl la ak rapò videyo)'.

Sous: www.habr.com

Add nouvo kòmantè