Docker: zlá rada

Docker: zlá rada

Keď som sa učil riadiť auto, hneď na prvej hodine inštruktor vošiel do križovatky spiatočkou a potom povedal, že to by ste nemali robiť - nikdy. Toto pravidlo som si zapamätal okamžite a na celý život.

Čítate deťom „Zlé rady“ od Grigorija Ostera a vidíte, ako ľahko a prirodzene im dôjde, že by to nemali robiť.

O tom, ako správne napísať Dockerfile, bolo napísaných veľa článkov. Nestretol som sa však s pokynmi, ako napísať nesprávne súbory Dockerfiles. Vypĺňam túto medzeru. A možno v projektoch, ktoré dostávam podporu, bude takýchto dockerfiles menej.

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

Vytváranie súboru Dockerfile, zlovestné a hrozné

Peter (Senior java/rubby/php developer): Kolega Vasily, už ste nahrali nový modul do Dockera?
Vasily (junior): Nie, nemal som čas, nemôžem na to prísť s týmto Dockerom. Je o tom toľko článkov, až je to závratné.

Peter: Termín sme mali už pred rokom. Dovoľte mi, aby som vám pomohol, prídeme na to v procese. Povedz mi, čo ti nefunguje.

Vasily: Nemôžem vybrať základný obrázok tak, aby bol minimálny, ale mal všetko, čo potrebujete.
Peter: Vezmite si obrázok ubuntu, má všetko, čo potrebujete. A to, čo je veľa nepotrebných vecí, príde vhod neskôr. A nezabudnite pridať najnovšiu značku, aby bola verzia vždy najnovšia.

A prvý riadok sa objaví v Dockerfile:

FROM ubuntu:latest

Peter: Čo ďalej, čo sme použili na napísanie nášho modulu?
Vasily: Takže ruby, existuje webový server a malo by sa spustiť niekoľko servisných démonov.
Peter: Áno, čo potrebujeme: ruby, bundler, nodejs, imagemagick a čo ešte... A zároveň urobiť upgrade, aby ste určite získali nové balíčky.
Vasily: A nevytvoríme používateľa, aby sme neboli pod rootom?
Peter: Jeb na to, potom sa ešte musíš motať s právami.
Vasilij: Potrebujem čas, asi 15 minút, aby som to všetko spojil do jedného príkazu, čítal som, že...
(Peter hrubo preruší starostlivého a veľmi bystrého juniora.)
Peter: Píšte samostatnými príkazmi, bude sa to lepš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/*

Potom Igor Ivanovič, DevOps (ale viac Ops ako Dev), vtrhne do kancelárie a kričí:

AI: Peťo, tvoji vývojári opäť rozbili potravinovú databázu, kedy to skončí...

Po menšej potýčke Igor Ivanovič vychladne a začne zisťovať, čo tu jeho kolegovia robia.

AI: Čo to robíš?
Vasily: Peter mi pomáha vytvoriť Dockerfile pre nový modul.
AI: Pozriem sa na to... Čo ste tu napísali, repozitár vyčistíte samostatným príkazom, toto je ďalšia vrstva... Ale ako nainštalujete závislosti, ak ste neskopírovali Gemfile! A vo všeobecnosti to nie je dobré.
Peter: Prosím, venuj sa svojej veci, nejako to vymyslíme.

Igor Ivanovič si smutne povzdychne a odchádza zistiť, kto rozbil databázu.

Peter: Áno, ale s tým kódom mal pravdu, treba ho vtlačiť do obrazu. A okamžite nainštalujte ssh a supervízora, inak spustíme démonov.

Vasily: Potom najprv skopírujem Gemfile a Gemfile.lock, potom všetko nainštalujem a potom skopírujem celý projekt. Ak sa Gemfile nezmení, vrstva sa prevezme z vyrovnávacej pamäte.
Peter: Prečo ste všetci s týmito vrstvami, skopírujte všetko naraz. Okamžite skopírujte. Hneď prvý riadok.

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áte konfigurácie pre supervízora?
Vasilij: Nie, nie. Ale urobím to rýchlo.
Peter: Potom to urobíš. Poďme si teraz načrtnúť init skript, ktorý všetko spustí. Dobre, takže spustíte ssh pomocou nohup, aby sme sa mohli pripojiť ku kontajneru a zistiť, čo sa pokazilo. Potom rovnakým spôsobom spustite supervízora. No, potom už len bež pasažier.
Otázka: Čítal som však, že by mal existovať jeden proces, takže Docker bude vedieť, že sa niečo pokazilo, a môže reštartovať kontajner.
P: Netráp si hlavu hlúposťami. A vo všeobecnosti, ako? Ako to všetko spustiť v jednom procese? Nechajte Igora Ivanoviča premýšľať o stabilite, nie nadarmo dostáva plat. Našou úlohou je písať kód. A vo všeobecnosti mu dovoľte poďakovať, že sme pre neho napísali Dockefile.

10 minút a dve videá o mačkách neskôr.

O: Urobil som všetko. Pridal som viac komentárov.
P: Ukáž mi!

Najnovšia verzia Dockerfile:

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

# Устанавливаем bundler
RUN gem install bundler

# Устанавливаем nodejs используется для сборки статики
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/* 

# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD [“/app/init.sh”]

P: Super, páči sa mi to. A komentáre sú v ruštine, pohodlné a čitateľné, každý by tak fungoval. Všetko som ťa naučil, ostatné si môžeš urobiť sám. Poďme na kávu...

No a teraz tu máme úplne strašný Dockerfile, pri pohľade na ktorý bude chcieť Igor Ivanovič skončiť a oči ho budú bolieť ešte týždeň. Dockerfile by, samozrejme, mohol byť ešte horší, dokonalosti sa medze nekladú. Ale na začiatok to bude stačiť.

Na záver by som rád uviedol citát od Grigorija Ostera:

Ak si ešte nie ste istý
Vybrali sme si cestu v živote,
A ty nevieš prečo
Začnite svoju pracovnú cestu,
Rozbite žiarovky na chodbách -
Ľudia vám povedia „Ďakujem“.
Pomôžete ľuďom
Šetrite elektrinu.

Zdroj: hab.com

Pridať komentár