Docker: ohtlikud nõuanded

Docker: ohtlikud nõuanded

Kui ma õppisin autot juhtima, siis esimesel tunnil sõitis instruktor ristmikul tagurpidi ja ütles seejärel, et selliselt ei tohi kunagi teha. Selle reegli ma mäletan kohe ja igavesti.

Lugedes lastele Grigori Ostre «Kahjulikke nõuandeid», näed, kui kergelt ja loomulikult jõuab neile kohale, et nii teha ei tohi.

On kirjutatud palju artikleid selle kohta, kuidas õigesti kirjutada Dockerfile'i. Aga ma pole kokku sattunud juhenditega, kuidas kirjutada vale Dockerfile. Täidan selle puudujäägi. Ja ehk mu projektides, mida ma toetan, selliseid dockerfile'e enam ei esine.

Kõik tegelased, olukorrad ja Dockerfile on kujuteldavad. Kui olete ennast ära tundnud, vabandust.

Loome Dockerfile'i, kurja ja kohutava.

Peeter (kogenud java/ruby/php arendaja): Kollega Vassili, kas sa oled juba uus moodul Dockerisse üles laadinud?
Vassili (algaja): Ei, ei jõudnud, ei saa kuidagi Dockeriga hakkama. Nii palju artikleid selle kohta, et silmad lähevad ristiga.

Peeter: Meie tähtaeg oli juba aasta tagasi. Tule, aitan, protsessi käigus saame aru. Räägi, mis sul seal ei toimi.

Vassili: Ma ei saa valida baaspilti, et see oleks minimaalne, aga sisaldaks kõike vajalikku.
Peeter: Võta ubuntu pilt, seal on kõik, mis vajalik. Ja mis üle jääb, seda võib hiljem vaja minna. Ära unusta panna täge latest, et versioon oleks alati uusim.

Ja Dockerfile'i ilmub esimene rida:

FROM ubuntu:latest

Peeter: Mida me edasi kirjutame, millega me meie moodulit tegime?
Vassili: Noh, ruby, seal peaks jooksma veebiserver ja paar teenindavat deemonit.
Peeter: Aha, mida me vajame: ruby, bundler, nodejs, imagemagick ja mis seal veel ... Ja tee upgrade, et kindlasti saaksime uued paketid.
Vassili: Kas me ei loo kasutajat, et mitte rooti alt?
Peeter: Jäta, hiljem hakkame õigustega jamama.
Vassili: Mul on vaja aega, umbes 15 minutit, et see kõik üheks käskluseks kokku panna, ma lugesin, et...
(Peeter katkestab karmilt pedantse ja ülemõtleva juuni.)
Peeter: Kirjuta eraldi käsklustena, nii on lihtsam lugeda.

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/*

Siin tõukab kabinetti Igor Ivanovits, DevOps (rohkem Ops kui Dev), karjudes:

AI: Peeter, sinu arendajad lõhkusid jälle tootmisandmebaasi, millal see lõpuks lõppeb…

Pärast väikest vaidlust rahuneb Igor Ivanovitš ja hakkab uurima, millega kolleegid siin tegelesid.

AI: Mida teete?
Vassili: Peeter aitab mul uue mooduli jaoks Dockerfile'i koostada.
AI: Las ma vaatan… Mis te siin kirjutasite, te ju puhastate repositooriumi eraldi meeskonnaga, see on ju täiendav kiht… Kuidas te sõltuvusi paigaldate, kui te ei kopeerinud Gemfile'i! Ja üldiselt, see ei sobi kuhugi.
Peeter: Palun minge oma asjadega edasi, me siin saame ise hakkama.

Igor Ivanovitš ohkab kurvalt ja läheb uurima, kes ikkagi lõhkus andmebaasi.

Peeter: Jah, aga koodi osas ütles ta õigesti, peame selle pildiks panema. Ja paneme kohe ssh ja supervisor'i, muidu kuidas me deemonid käivitame.

Vassili: Ma kopeerin siis kõigepealt Gemfile'i ja Gemfile.lock'i, paigaldan kõik ja siis kopeerin kogu projekti. Kui Gemfile ei muutu, võetakse kiht vahemälust.
Peeter: Miks te kõik nende kihtidega räägite, kopeerige kohe kõik. Kopeerige kohe. Esimese reaga.

Dockerfile näeb nüüd välja järgmiselt:

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 nüüd edasi. Kas sul on supervisor jaoks konfide faile?
Vassili: Ei, pole. Aga ma teen kiiresti.
Peeter: Tee hiljem. Lähme nüüd koostama init skripti, mis kõik käivitab. Okei, starte ssh nohup'iga, et me saaksime konteinerisse sisse logida ja näha, mis valesti läks. Siis käivita supervisor samuti. Ja lõpuks käivita passenger.
K: Aga ma lugesin, et peaks olema üks protsess, siis teab Docker, et midagi on valesti ja suudab konteinerit uuesti käivitada.
P: Ära muretse selliste asjade pärast. Ja kuidas? Kuidas sa kõike ühes protsessis käivitad? Las Igor Ivanovitš muretseb stabiilsuse pärast, ta ju saab palka selle eest. Meie asi on koodi kirjutada. Ja üleüldse, las ütleb aitäh, et me tema eest Dockerfile'i kirjutasime.

Kümme minutit ja kaks kassivideot hiljem.

K: Ma tegin kõik valmis. Panin veel kommentaare juurde.
P: Näita!

Uus versioon Dockerfile'ist:

FROM ubuntu:latest

# Kopeerime lähtekoodi
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, mida kasutatakse staatika kokkupanemiseks
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 oma vahemähi
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, meeldib. Ja kommentaarid vene keeles, mugav ja arusaadav, kõik peaksid nii töötama. Ma õpetasin sulle kõik, edaspidi saad ise hakkama. Lähme kohvi jooma…

Noh, nüüd saime ideaalselt kohutava Dockerfile'i, mille nägemine paneb Igor Ivanovit vallandama ning tal on silmad veel nädala aega haiged. Dockerfile võiks muidugi olla veel hullem, täiusele ei ole piire. Aga alguseks sobib ka nii.

Tahaks lõpetada Grigori Ostori tsitaadiga:

Kui te veel kindlalt
Elus teed valisite,
Ja ei tea, millest alustada
Teie tööteed,
Lööge lampide sissepääsudesse —
Inimesed ütlevad teile 'Aitäh'.
Te aitate rahval
elektrit säästa.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster