
Kui ma autot juhtima õppisin, sõitis instruktor esimesel tunnil tagurdades ristmikule ja siis ütles, et nii ei tohi teha — üldse mitte kunagi. Selle reegli mäletan ma kohe ja terve elu.
Lugedes lastele Grigori Osteri 'Kahjulikke soovitusi', näed, kui kergesti ja muretult jõuab neile kohale, et nii ei tohi teha.
Dockerfile'i õigesti kirjutamise kohta on kirjutatud palju artikleid. Aga ma pole näinud juhiseid, kuidas kirjutada vale Dockerfile. Täidan selle tühiku. Ja ehk projektides, mis ma hooldan, selliseid Dockerfile'e tuleb vähem.
Kõik tegelased, olukorrad ja Dockerfile on väljamõeldud. Kui sa end ära tuntud, vabandan.
Loome Dockerfile'i, hirmsa ja õudse.
Peeter (senior java/ruby/php arendaja): Kollega Vassili, kas oled juba Dockerisse uue mooduli üles laadinud?
Vassili (junior): Ei, ei ole jõudnud, ei saa selle Dockeriga kuidagi hakkama. Nii palju artikleid selle kohta, et silmad jooksevad kokku.
Peeter: Meie tähtaeg oli juba aasta tagasi. Tule, aitan, protsessi käigus saame aru. Räägi, mis sul siis ei õnnestu.
Vassili: Ei oska valida baaspilti, et oleks minimaalne, aga kõik vajalik oleks olemas.
Peeter: Võta ubuntu pilt, seal on kõik vajalik. Ja kui palju üleliigset, siis tuleb see hiljem kasuks. Ja ära unusta panna latest silt, et versioon oleks alati uusim.
Ja Dockerfile'is tekib esimene rida:
FROM ubuntu:latestPeeter: Mis seal edasi on, millega me oma moodulit kirjutasime?
Vassili: Noh ruby, seal peab olema veebiserver ja paar teenindavat deemonit.
Peeter: Aha, mida me vajame: ruby, bundler, nodejs, imagemagick ja mis seal veel ... Ja samas, tee upgrade, et kindlasti saada uusimad paketid.
Vassili: Kas me ei peaks kasutajat looma, et mitte root'i alt?
Peeter: Ei, hiljem veel teeme õigustega muret.
Vassili: Mul on vaja aega, umbes 15 minutit, et kõike ühendada ühte käsku, ma lugesin, et ...
(Peeter katkestab karmilt ülemugava ja liiga nutika juniori.)
Peeter: Kirjuta eraldi käskudena, siis on ka lugeda lihtsam.
Dockerfile kasvab:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get upgrade
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full
RUN gem install bundler
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
RUN bundle install --without development test --path vendor/bundle
RUN rm -rf /usr/local/bundle/cache/*.gem
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*Siia kabinetisse siseneb Igor Ivanovitš, DevOps (aga rohkem Ops kui Dev), karjudes:
II: Peeter, sinu arendajad on jälle tootmisandmebaasi puruks teinud, millal see piirdub….
Pärast väikest vaidlust rahuneb Igor Ivanovitš ja hakkab uurima, millega kolleegid siin tegelevad.
AI: Millega on hõivatud?
Vasili: Peeter aitab mul koostada Dockerfile'i uue mooduli jaoks.
AI: Las ma vaatan... Mis te siia kirjutasite, te ju puhastate hoidlat eraldi meeskonnaga, see on ju lisakiht... Kuidas te sõltuvusi seadistate, kui te ei kopeerinud Gemfile'i! Ja üleüldse, see ei sobi kuhugi.
Peeter: Palun minge oma asjadega, me saame siin ise hakkama.
Igor Ivanovitš ohkab kurvalt ja lahkub uurima, kes siis andmebaasi rikkus.
Peeter: Jah, aga koodi osas oli ta õigesti öelnud, et see tuleb pildi sisse packida. Ja paneme kohe ssh ja supervisor'i paika, muidu kuidas me demonid käivitame.
Vasili: Ma kopeerin kõigepealt Gemfile'i ja Gemfile.lock'i, siis paigaldan kõik, ja siis kopeerin kogu projekti. Kui Gemfile ei muutu, siis võetakse kiht vahemälust.
Peeter: Miks te ootab nendega kihtidega, kopeeri kohe kõik. Kopeeri kohe. Esimese reana.
Dockerfile näeb nüüd välja selline:
FROM ubuntu:latest
COPY .\/ \/app
WORKDIR \/app
RUN apt-get update
RUN apt-get upgrade
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor
RUN gem install bundler
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
RUN bundle install --without development test --path vendor\/bundle
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem
RUN apt-get clean
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* Peeter: Nii, mis edasi. Kas sul on supervisor'i konfiguratsioonifailid?
Vasili: Ei, mul ei ole. Aga ma teen kiiresti.
Peeter: Tee hiljem. Las ma näitame praegu init skripti, mis kõik käivitab. Nii, alustad ssh-d nohup'iga, et saaksime konteinerisse ühenduda ja vaadata, mis valesti läks. Siis käivita samuti supervisor. Ja lõpuks käivitad lihtsalt passenger'i.
V: Aga ma lugesin, et peaks olema üks protsess, siis teab Docker, et midagi läks valesti ja suudab konteinerit taaskäivitada.
P: Ära pea pead jaburustega. Ja üleüldse, kuidas? Kuidas sa seda kõike ühe protsessina käivitad? Las Igor Ivanovitš mõtleb stabiilsusele, pole ju ilmselge, et ta palka saab. Meie asi on koodi kirjutada. Ja las ta ütleb aitäh, et me tema eest Dockerfile'i kirjutasime.
Kümme minutit hiljem ja kaks kassivideot.
V: Olen kõik teinud. Lisasin veel kommentaare.
P: Näita!
Uus versioon Dockerfile'ist:
FROM ubuntu:latest
# Kopeerime algkoodi
COPY .\/\/app
WORKDIR \/app
# Uuendame pakettide nimekirja
RUN apt-get update
# Uuendame paketid
RUN apt-get upgrade
# Paigaldame vajalikud paketid
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor
# Paigaldame bundleri
RUN gem install bundler
# Paigaldame nodejs, mis on vajalik staatiliste koosseadmiste jaoks
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
# Paigaldame sõltuvused
RUN bundle install --without development test --path vendor\/bundle
# Koristame järel jäägid
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem
RUN apt-get clean
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*
# Käivitame skripti konteineri käivitamisel, mis käivitab kõik muu.
CMD ["\/app\/init.sh"]P: Suurepärane, mulle meeldib. Ja kommentaarid vene keeles, mugavad ja loetavad, kõik peaksid niimoodi töötama. Ma õpetasin sind kõike, edaspidi saad ise hakkama. Lähme kohvi jooma…
Noh, me saime erakordselt kohutava Dockerfile'i, mille nägemine ajab Igor Ivanovit lahkumiseks ning tal hakkab silmad nädal aega valutama. Dockerfile võinuks muidugi veel halvem olla, täiuslikkusele pole piire. Aga alguseks sobib küll.
Sooviks lõpetada tsitaadiga Grigori Ostrovi:
Kui te pole veel kindlalt
Elus teed valinud,
Ja ei tea, kust alustada
Oma töökäiku,
Peksake tuli üles astmetes —
Inimesed ütlevad teile „Aitäh”.
Te aitate rahvast
Elektrit säästa.
Allikas: habr.com
