Docker: loš savjet

Docker: loš savjet

Kada sam učio da vozim auto, već na prvom času instruktor je uleteo u raskrsnicu u rikverc, a onda je rekao da to ne treba da radiš – nikako. Sjetio sam se ovog pravila odmah i do kraja života.

Čitate djeci “Loš savjet” Grigorija Ostera i vidite kako im lako i prirodno pada na pamet da to ne treba da rade.

Mnogo je članaka napisano o tome kako ispravno napisati Dockerfile. Ali nisam naišao na upute kako napisati pogrešne Dockerfiles. Popunjavam ovu prazninu. A možda će u projektima koje dobijem podršku biti manje takvih docker fajlova.

Svi likovi, situacije i Dockerfile su izmišljeni. Ako se prepoznaš, izvini.

Kreiranje Dockerfile-a, zlokobno i strašno

Peter (Senior java/rubby/php developer): Kolega Vasily, jeste li već postavili novi modul u Docker?
Vasilij (junior): Ne, nisam imao vremena, ne mogu to da shvatim sa ovim Dockerom. Ima toliko članaka o tome, da je vrtoglavo.

Peter: Imali smo rok prije godinu dana. Dozvolite mi da vam pomognem, shvatićemo to u procesu. Reci mi šta ti ne ide.

Vasilij: Ne mogu odabrati osnovnu sliku tako da bude minimalna, ali ima sve što vam treba.
Peter: Uzmi ubuntu sliku, ima sve što ti treba. A ono što je puno nepotrebnih stvari će dobro doći kasnije. I ne zaboravite staviti najnoviju oznaku kako bi verzija uvijek bila najnovija.

I prvi red se pojavljuje u Dockerfileu:

FROM ubuntu:latest

Peter: Šta je sljedeće, čime smo napisali naš modul?
Vasily: Dakle, ruby, postoji web server i treba pokrenuti nekoliko servisnih demona.
Peter: Da, šta nam treba: ruby, bundler, nodejs, imagemagick i šta još... I u isto vrijeme uradite nadogradnju da definitivno dobijete nove pakete.
Vasilij: I nećemo kreirati korisnika da ne bismo bili pod root-om?
Peter: Jebi ga, onda se još moraš glupirati sa pravima.
Vasilij: Treba mi vremena, oko 15 minuta, da sve spojim u jednu komandu, pročitao sam da...
(Peter grubo prekida pedantan i veoma pametan junior.)
Petar: Pišite u odvojene komande, biće lakše za čitanje.

Dockerfile raste:

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

Tada Igor Ivanovič, DevOps (ali više Ops nego Dev), upada u kancelariju vičući:

AI: Petya, tvoji programeri su ponovo razbili bazu podataka o hrani, kada će se ovo završiti...

Nakon malog okršaja, Igor Ivanovič se ohladi i počinje da sazna šta njegove kolege rade ovde.

AI: Šta radiš?
Vasily: Peter mi pomaže da napravim Dockerfile za novi modul.
AI: Da pogledam... Šta si napisao ovdje, čistiš spremište posebnom komandom, ovo je dodatni sloj... Ali kako instalirati zavisnosti ako nisi kopirao Gemfile! I generalno, ovo nije dobro.
Peter: Molim te idi svojim poslom, nekako ćemo to riješiti.

Igor Ivanovič tužno uzdiše i odlazi da otkrije ko je razbio bazu podataka.

Peter: Da, ali bio je u pravu u vezi sa kodom, moramo ga gurnuti u sliku. I hajde da odmah instaliramo ssh i supervizor, inače ćemo pokrenuti demone.

Vasilij: Onda ću prvo kopirati Gemfile i Gemfile.lock, zatim ću sve instalirati, a zatim ću kopirati cijeli projekat. Ako se Gemfile ne promijeni, sloj će biti preuzet iz keša.
Peter: Zašto ste svi sa ovim slojevima, kopirajte sve odjednom. Kopiraj odmah. Prva linija.

Dockerfile sada izgleda ovako:

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

Petar: Pa, šta dalje? Imate li konfiguracije za supervizora?
Vasilij: Ne, ne. Ali uradiću to brzo.
Peter: Onda ćeš to učiniti. Hajde da sada skiciramo init skriptu koja će sve pokrenuti. U redu, pokrenite ssh, sa nohup-om, da se povežemo sa kontejnerom i vidimo šta je pošlo po zlu. Zatim pokrenite supervizor na isti način. Pa, onda samo trči putnik.
P: Ali pročitao sam da bi trebao postojati jedan proces, tako da će Docker znati da je nešto pošlo po zlu i može ponovo pokrenuti kontejner.
P: Ne zamarajte se glupostima. I općenito, kako? Kako sve ovo izvoditi u jednom procesu? Neka Igor Ivanovič razmišlja o stabilnosti, nije uzalud prima platu. Naš posao je da napišemo kod. I općenito, neka kaže hvala što smo napisali Dockefile za njega.

10 minuta i dva videa o mačkama kasnije.

P: Sve sam uradio. Dodao sam još komentara.
P: Pokaži mi!

Najnovija verzija Dockerfile-a:

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: Odlično, sviđa mi se. A komentari su na ruskom, zgodni i čitljivi, svi bi tako radili. Sve sam te naučio, ostalo možeš sam. Idemo na kafu...

Pa, sada imamo savršeno užasan Dockerfile, čiji će pogled natjerati Igora Ivanoviča da odustane, a oči će ga boljeti još nedelju dana. Dockerfile bi, naravno, mogao biti još gori, ne postoji granica savršenstvu. Ali za početak, ovo će biti dovoljno.

Završio bih citatom Grigorija Ostera:

Ako još niste sigurni
Izabrali smo put u životu,
I ne znaš zašto
Započnite svoj radnički put,
Polomite sijalice u hodnicima -
Ljudi će vam reći "Hvala".
Pomoći ćeš ljudima
Štedite električnu energiju.

izvor: www.habr.com

Dodajte komentar