Docker: Špatná rada

Docker: Špatná rada

Když jsem se učil řídit auto, hned na první hodině vjel instruktor do křižovatky zpátečkou a pak řekl, že to nesmíte – vůbec nikdy. Toto pravidlo jsem si zapamatoval okamžitě a na celý život.

Čtete dětem „Špatné rady“ od Grigorije Ostera a vidíte, jak snadno a přirozeně jim dojde, že by to neměly dělat.

O tom, jak správně napsat Dockerfile, bylo napsáno mnoho článků. Ale nenarazil jsem na návod, jak napsat nesprávné Dockerfiles. Vyplňuji tuto mezeru. A možná v projektech, které dostanu podporu, bude takových dockerfilů méně.

Všechny postavy, situace a Dockerfile jsou fiktivní. Pokud se poznáváte, omlouvám se.

Vytváření Dockerfile, zlověstné a hrozné

Peter (Senior java/rubby/php developer): Kolego Vasily, už jste nahráli nový modul do Dockeru?
Vasily (junior): Ne, neměl jsem čas, s tím Dockerem na to nemůžu přijít. Je o tom tolik článků, je to závratné.

Peter: Termín jsme měli před rokem. Dovolte mi, abych vám pomohl, během procesu na to přijdeme. Řekni mi, co ti nefunguje.

Vasily: Nemohu vybrat základní obrázek tak, aby byl minimální, ale měl vše, co potřebujete.
Peter: Vezměte si obrázek ubuntu, má vše, co potřebujete. A to, co je spousta nepotřebných věcí, se bude hodit později. A nezapomeňte přidat nejnovější značku, aby verze byla vždy nejnovější.

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

FROM ubuntu:latest

Peter: Co bude dál, co jsme použili k napsání našeho modulu?
Vasily: Takže ruby, existuje webový server a mělo by být spuštěno několik servisních démonů.
Peter: Jo, co potřebujeme: ruby, bundler, nodejs, imagemagick a co ještě... A zároveň udělat upgrade, abys určitě dostal nové balíčky.
Vasily: A my si nevytvoříme uživatele, abychom nebyli pod rootem?
Peter: Do prdele, pak si budeme muset ještě pohrát s právy.
Vasily: Potřebuji čas, asi 15 minut, abych to všechno dal dohromady do jednoho příkazu, četl jsem, že...
(Petr hrubě přeruší pečlivého a velmi chytrého juniora.)
Petr: Pište samostatnými příkazy, bude se to 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/*

Pak Igor Ivanovič, DevOps (ale více Ops než Dev), vtrhne do kanceláře a zakřičí:

AI: Péťo, vaši vývojáři zase rozbili databázi potravin, kdy tohle skončí...

Igor Ivanovič po menší potyčce vychladne a začne zjišťovat, co tu jeho kolegové dělají.

AI: Co to děláš?
Vasily: Peter mi pomáhá vytvořit Dockerfile pro nový modul.
AI: Dovolte mi se podívat... Co jste tu napsal, vyčistíte repozitář samostatným příkazem, toto je další vrstva... Ale jak nainstalujete závislosti, když jste nezkopírovali Gemfile! A obecně to není dobré.
Peter: Prosím, jdi si za svým, nějak to vymyslíme.

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

Peter: Ano, ale s tím kódem měl pravdu, musíme ho vtlačit do obrazu. A okamžitě nainstalujme ssh a správce, jinak spustíme démony.

Vasilij: Pak nejprve zkopíruji Gemfile a Gemfile.lock, pak vše nainstaluji a pak zkopíruji celý projekt. Pokud se Gemfile nezmění, vrstva se převezme z mezipaměti.
Peter: Proč jste všichni s těmito vrstvami, kopírujte vše najednou. Ihned zkopírujte. Hned 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/* 

Peter: Tak co dál? Máte konfigurace pro supervizora?
Vasily: Ne, ne. Ale udělám to rychle.
Petr: Tak to uděláš. Pojďme si nyní načrtnout init skript, který vše spustí. Dobře, takže spustíte ssh pomocí nohup, abychom se mohli připojit ke kontejneru a zjistit, co se pokazilo. Poté stejným způsobem spusťte supervizora. No, pak stačí spustit cestující.
Otázka: Ale četl jsem, že by měl existovat jeden proces, takže Docker bude vědět, že se něco pokazilo, a může restartovat kontejner.
P: Netrápte si hlavu nesmysly. A obecně, jak? Jak to všechno spustit v jednom procesu? Nechte Igora Ivanoviče přemýšlet o stabilitě, ne nadarmo dostává plat. Naším úkolem je psát kód. A obecně, ať poděkuje, že jsme pro něj napsali Dockefile.

10 minut a dvě videa o kočkách později.

Q: Udělal jsem všechno. Přidal jsem další komentáře.
P: Ukaž!

Nejnovější verze 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, líbí se mi to. A komentáře jsou v ruštině, pohodlné a čitelné, každý by tak fungoval. Všechno jsem tě naučil, zbytek zvládneš sám. Pojďme si dát kávu...

No a teď tu máme dokonale příšerný Dockerfile, při pohledu na nějž Igor Ivanovič bude chtít skončit a ještě týden ho budou bolet oči. Dockerfile by samozřejmě mohl být ještě horší, dokonalosti se meze nekladou. Ale pro začátek to bude stačit.

Rád bych zakončil citátem od Grigorije Ostera:

Pokud si ještě nejste jisti
Vybrali jsme si cestu životem,
A ty nevíš proč
Začněte svou pracovní cestu,
Rozbijte žárovky na chodbách -
Lidé vám řeknou „děkuji“.
Pomůžete lidem
Ušetřete elektřinu.

Zdroj: www.habr.com

Přidat komentář