Docker: škodlivé rady

Docker: škodlivé rady

Když jsem se učil řídit auto, při první lekci instruktor vyjel na křižovatku couváním a pak řekl, že to se nesmí dělat — vůbec nikdy. Toto pravidlo jsem si zapamatoval okamžitě a na celý život.

Čteš dětem 'Zlé rady' Grigorije Ostera a vidíš, jak snadno a bez námahy jim dochází, že se takto chovat nedá.

O tom, jak správně psát Dockerfile, bylo napsáno spousta článků. Ale nikdy jsem nenarazil na instrukce, jak psát špatné Dockerfile. Tento nedostatek napravím. Možná v projektech, které dostávám na podporu, takových dockerfile ubyde.

Všechny postavy, situace a Dockerfile jsou smyšlené. Pokud jste se poznali, omlouvám se.

Vytváříme Dockerfile, zlověstný a hrozný

Petr (senior java/ruby/php developer): Kolego Vasilii, už jste nahrál do Dockeru nový modul?
Vasiliy (junior): Ne, nestihl jsem to, s tím Dockerem si vůbec nevím rady. Tolik článků na to téma, oči se mi rozbíhají.

Petr: Náš termín vypršel už před rokem. Pojď, pomůžu ti, v procesu se s tím srovnáme. Vyprávěj, co ti nejde.

Vasiliy: Nemohu vybrat základní obraz, aby byl co nejmenší, ale zároveň obsahoval vše potřebné.
Petr: Vezmi obraz ubuntu, tam je všechno, co potřebuješ. A to, co bude navíc, se pak ještě může hodit. A nezapomeň nastavit tag latest, aby byla verze vždy nejnovější.

A v Dockerfile se objeví první řádek:

FROM ubuntu:latest

Petr: Co tam máme dál, na čem jsme psali náš modul?
Vasiliy: Tak přece ruby, tam by měl běžet webový server a pár služebních démonů.
Petr: Aha, co potřebujeme: ruby, bundler, nodejs, imagemagick no a co ještě ... A také udělej upgrade, abys dostal nové balíčky.
Vasiliy: Nebudeme vytvářet uživatele, abychom nemuseli pracovat pod root?
Petr: Ale kdepak, s právy se budeme babrat později.
Vasiliy: Potřebuji čas, asi 15 minut, abych to všechno sloučil do jedné příkazu, četl jsem, že ...
(Petr hrubě přerušuje dotěrného a příliš chytrého juniora.)
Petr: Piš to jako jednotlivé příkazy, tak se to bude lépe číst.

Dockerfile roste:

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

Teď se do kanceláře vřítil Igor Ivanovič, DevOps (ale více Ops než Dev), s křikem:

II: Petě, tvoji vývojáři zase rozbili produkční databázi, kdy to už skončí….

Po malé hádce Igor Ivanovič vychladne a začíná zjišťovat, co tu kolegové dělají.

AI: Čím jste zaměstnaní?
Vasilij: Petr mi pomáhá sestavit Dockerfile pro nový modul.
AI: Nech mě se podívat… Co to tu máte napsáno, vždyť repozitář čistí jiný tým, to je přece další vrstva… Jak vůbec instalujete závislosti, když jste nekopírovali Gemfile! A vůbec, tohle nikam nevede.
Petr: Prosím, zařizujte si své záležitosti, my si s tím nějak poradíme.

Igor Ivanovič smutně vzdychne a odchází zjistit, kdo vlastně zničil databázi.

Petr: Ano, ale co se kódu týče, měl pravdu, je třeba ho dát do obrazu. A pojďme rovnou nainstalovat ssh a supervisor, jinak jak spustíme démony.

Vasilij: Tak já nejprve zkopíruji Gemfile a Gemfile.lock, pak všechno nainstaluji, a nakonec už zkopíruji celý projekt. Pokud se Gemfile nemění, vrstva bude brána z cache.
Petr: Co máte pořád s těmi vrstvami, zkopíruj hned všechno. Hned všechno. První řádek.

Dockerfile nyní vypadá 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/* 

Petr: Tak, co dál? Máš konfigurace pro supervisor?
Vasilij: Ne, nemám. Ale rychle to udělám.
Petr: Uděláš to potom. Teď návrhni init skript, který vše spustí. Takže, spustíš ssh s nohup, abychom se mohli připojit k kontejneru a zjistit, co se pokazilo. Pak stejně spusť supervisor. A nakonec spustíš passenger.
V: Ale četl jsem, že by měl být jeden proces, pak Docker ví, že se něco pokazilo a může kontejner restartovat.
P: Nezapomínej si hlavu s hloupostmi. A vůbec, jak to všechno spustíš v jednom procesu? Ať se o stabilitu stará Igor Ivanovič, dostává za to plat. Naším úkolem je psát kód. A vůbec, ať poděkuje, že jsme za něj napsali Dockerfile.

Po 10 minutách a dvou videích o kočičkách.

V: Všechno jsem udělal. Přidal jsem ještě komentáře.
P: Ukazuj!

Čerstvá verze Dockerfile:

FROM ubuntu:latest

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

# Aktualizujeme seznam balíčků
RUN apt-get update 

# Aktualizujeme balíčky
RUN apt-get upgrade

# Instalujeme potřebné balíčky
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Instalujeme bundler
RUN gem install bundler

# Instalujeme nodejs, který se používá pro sestavení statiky
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Instalujeme závislosti
RUN bundle install --without development test --path vendor\/bundle

# Čistíme za sebou mezipaměti
RUN rm -rf \/usr\/local\/bundle\/cache\/.*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Spouštíme skript při startu kontejneru, který spustí všechno ostatní.
CMD ["\/app\/init.sh"]

P: Skvěle, líbí se mi to. A komentáře v ruštině, pohodlné a čitelné, všichni by tak měli pracovat. Učil jsem tě všechno, teď už to zvládneš sám. Pojďme na kávu…

No, máme perfektně hrozný Dockerfile, při pohledu na který by se Igor Ivanovič chtěl vzdát a oči ho budou bolet ještě týden. Dockerfile mohl být samozřejmě ještě horší, dokonalosti se meze nekladou. Ale pro začátek to stačí.

Rád bych skončil citací Grigorije Ostera:

Pokud jste ještě nepevně
V životě zvolili cestu,
A nevíte, čím začít
Svou pracovní dráhu,
Bíjte žárovky na chodbách —
Lidé vám řeknou "Děkuji".
Pomůžete lidem
Šetřit elektřinu.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster