Docker: nezdravé rady

Docker: nezdravé rady

Keď som sa učil šoférovať, na prvej hodine inštruktor cúval na križovatku a potom povedal, že takto sa robiť nedá — nikdy. Toto pravidlo som si okamžite zapamätal na celý život.

Čítaš deťom "Zlé rady" Grigorija Ostera a vidíš, ako ľahko a bez námahy sa k nim dostáva, že takto sa to robiť nemôže.

O tom, ako správne písať Dockerfile, je napísané množstvo článkov. Ale nikdy som nenarazil na návody, ako písať nesprávne Dockerfile. Tento nedostatok sa chystám naplniť. A možno v projektoch, ktoré dostanem na podporu, bude takýchto dockerfile menej.

Všetky postavy, situácie a Dockerfile sú fiktívne. Ak ste sa poznali, prepáčte.

Vytvárame Dockerfile, zlovestný a hrozný

Petr (senior java/ruby/php developer): Kolega Vasiliy, už si nahral do Dockeru nový modul?
Vasiliy (junior): Nie, nestihol som to, nemôžem sa s tým Dockerom zorientovať. Tých článkov je toľko, že som z toho zmätený.

Petr: Náš deadline bol pred rokom. Poď, pomôžem ti, počas procesu sa to naučíme. Povedz, čo sa ti nedarí.

Vasiliy: Neviem si vybrať základný obraz, aby bol minimálny, ale obsahoval všetko potrebné.
Petr: Ber obraz ubuntu, v ňom je všetko potrebné. A ak tam je niečo navyše, neskôr sa ti to zíde. A nezabudni nastaviť tag latest, aby verzia bola vždy najnovšia.

A v Dockerfile sa objavuje prvý riadok:

FROM ubuntu:latest

Petr: A čo je ďalej, na čom sme písali náš modul?
Vasiliy: No predsa ruby, mal by sa spustiť webový server a pár pomocných démonov.
Petr: Aha, čo potrebujeme: ruby, bundler, nodejs, imagemagick a čo tam ešte … A zároveň, sprav upgrade, aby si určite dostal nové balíčky.
Vasiliy: Nebudeme vytvárať používateľa, aby sme nešli pod root?
Petr: No a čo, s právami ešte neskôr.
Vasiliy: Potrebujem čas, asi 15 minút, aby som to všetko zložil do jedného príkazu, čítal som, že…
(Petr drsne preruší zvedavého a veľmi bystrého juniora.)
Petr: Píš to jednotlivými príkazmi, tak sa to bude omnoho ľahšie čítať.

Dockerfile rastie:

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

Do kancelárie vtrhne Igor Ivanovič, DevOps (ale skôr Ops ako Dev), kričiac:

II: Petya, tvoji vývojári zase rozbili produkčnú databázu, kedy to už skončí….

Po menšej hádke Igor Ivanovič chladne a začne zisťovať, čomu sa kolegovia venujú.

AI: Čím sú zamestnaní?
Vasilij: Peter mi pomáha vytvoriť Dockerfile pre nový modul.
AI: Dajte sa pozrieť... Čo ste tu napísali, veď čistíte repozitár samostatným príkazom, to je ďalšia vrstva... A ako inštalujete závislosti, ak ste nekopírovali Gemfile! A vôbec, toto nikam nevedie.
Peter: Prosím, choďte sa venovať svojim záležitostiam, my si tu nejako poradíme.

Igor Ivanovič smútil vzdychne a odchádza zisťovať, kto vlastne rozbil DB.

Peter: Áno, ale má pravdu ohľadom kódu, treba ho dať do imidžu. A poďme rovno nainštalovať ssh a supervisor, inak ako spustíme démonov.

Vasilij: Tak ja najprv skopírujem Gemfile a Gemfile.lock, potom všetko nainštalujem a potom už skopírujem celý projekt. Ak sa Gemfile nemení, vrstva sa vezme z cache.
Peter: Čo s týmito vrstvami, skopíruj hneď všetko. Hneď všetko skopíruj. Prvým riadkom.

Dockerfile teraz vyzerá takto:

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

Peter: Tak, čo ďalej. Máš nejaké konfiguračné súbory pre supervisor?
Vasilij: Nie, nemám. Ale rýchlo to spravím.
Peter: Potom to spravíš. Teraz poďme spísať init skript, ktorý všetko spustí. Tak, spúšťaš ssh s nohup, aby sme sa mohli pripojiť k kontajneru a pozrieť sa, čo sa pokazilo. Potom spustíš aj supervisor. No a nakoniec jednoducho spustíš passenger.
V: Ale čítal som, že by mal byť jeden proces, inak Docker bude vedieť, že niečo sa pokazilo a bude môcť reštartovať kontajner.
P: Nezabíjaj si hlavu hlúposťami. A vôbec, ako? Ako toto všetko spustíš v jednom procese? Nech o stabilite rozmýšľa Igor Ivanovič, nie nadarmo dostáva výplatu. Našou úlohou je písať kód. A vôbec, nech povie ďakujem, že sme napísali Dockerfile za neho.

O 10 minút a dvoch videách s mačkami.

V: Vsetko som urobil. Pridal som aj nejaké komentáre.
P: Ukáž!

Čerstvá verzia Dockerfile:

FROM ubuntu:latest

# Kopírujeme zdrojový kód
COPY .\/ \/app
WORKDIR \/app

# Aktualizujeme zoznam balíčkov
RUN apt-get update 

# Aktualizujeme balíčky
RUN apt-get upgrade

# Inštalujeme potrebné balíčky
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Inštalujeme bundler
RUN gem install bundler

# Inštalujeme nodejs používaný na stavbu statiky
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Inštalujeme závislosti
RUN bundle install --without development test --path vendor\/bundle

# Upraceme si cache
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Spúšťame skript pri štarte kontajnera, ktorý spustí všetko ostatné.
CMD ["\/app\/init.sh"]

P: Výborne, páči sa mi to. A komentáre v ruštine, pohodlné a čitateľné, všetci by tak mali pracovať. Ja ťa všetko naučil, ďalej to zvládneš sám. Poďme na kávu…

Tak, máme dokonale hrozný Dockerfile, od pohľadu ktorého Igor Ivanovič chce odísť, a ešte týždeň ho budú bolieť oči. Dockerfile mohol byť samozrejme ešte horší, neexistuje limit dokonalosti. Ale na začiatok, a takto to stačí.

Chcel by som skončiť s citátom Grigorija Ostera:

Ak ste ešte pevne
V živote si vybrali cestu,
A neviete, od čoho by
Svoj pracovný chod začať,
Nabíjajte žiarovky vo vchodoch —
Ľudia vám povedia ‚Ďakujeme.‘
Pomôžete národu
Šetriť elektrinu.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster