Docker: loš savjet

Docker: loš savjet

Kad sam učila voziti auto, već na prvom satu je instruktor ušao u raskrižje u rikverc, a onda je rekao da to ne smijete raditi - nikako. To sam pravilo odmah zapamtio i do kraja života.

Čitate djeci “Loše savjete” Grigorija Ostera i vidite kako im lako i prirodno sine da to ne bi smjeli činiti.

Napisano je mnogo članaka o tome kako ispravno napisati Dockerfile. Ali nisam naišao na upute o tome kako napisati netočne Docker datoteke. Ja popunjavam ovu prazninu. I možda će u projektima za koje dobijem podršku biti manje takvih docker datoteka.

Svi likovi, situacije i Dockerfile su izmišljeni. Ako se prepoznajete, oprostite.

Stvaranje Dockerfilea, zlokobnog i strašnog

Peter (Senior java/rubby/php developer): Kolega Vasily, jeste li već uploadali novi modul na Docker?
Vasilij (mlađi): Ne, nisam imao vremena, ne mogu to shvatiti s ovim Dockerom. Toliko je članaka o tome da je vrtoglavo.

Petar: Imali smo rok prije godinu dana. Dopustite da vam pomognem, riješit ćemo to u procesu. Reci mi što ti ne ide.

Vasily: 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 kasnije će dobro doći. I ne zaboravite staviti najnoviju oznaku kako bi verzija uvijek bila najnovija.

I prvi redak se pojavljuje u Dockerfileu:

FROM ubuntu:latest

Peter: Što je sljedeće, što smo koristili za pisanje našeg modula?
Vasily: Dakle, ruby, postoji web poslužitelj i trebalo bi pokrenuti nekoliko servisnih demona.
Peter: Da, što nam treba: ruby, bundler, nodejs, imagemagick i što još... A ujedno i nadogradnju da definitivno dobijemo nove pakete.
Vasily: I nećemo kreirati korisnika da ne bismo bili pod rootom?
Peter: Jebi ga, onda se još moraš zezati s pravima.
Vasily: Treba mi vremena, oko 15 minuta, da sve to spojim u jednu naredbu, pročitao sam to...
(Petar grubo prekida pedantnog i vrlo pametnog juniora.)
Peter: Pišite zasebne naredbe, bit će lakše čitati.

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 Ivanovich, DevOps (ali više Ops nego Dev), upada u ured vičući:

AI: Petja, tvoji programeri su opet razbili bazu podataka o hrani, kada će ovo završiti...

Nakon malog okršaja, Igor Ivanovich se hladi i počinje otkrivati ​​što njegovi kolege rade ovdje.

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

Igor Ivanovich tužno uzdahne i odlazi otkriti tko je razbio bazu podataka.

Peter: Da, ali bio je u pravu u vezi koda, moramo ga ugurati u sliku. I odmah instalirajmo ssh i supervisor, inače ćemo pokrenuti demone.

Vasily: Onda ću prvo kopirati Gemfile i Gemfile.lock, zatim ću sve instalirati, a zatim ću kopirati cijeli projekt. Ako se Gemfile ne promijeni, sloj će biti preuzet iz predmemorije.
Peter: Zašto ste svi s 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/* 

Peter: Pa, što dalje? Imate li konfiguracije za nadzornika?
Vasilij: Ne, ne. Ali učinit ću to brzo.
Petar: Onda ćeš to učiniti. Idemo sada skicirati init skriptu koja će sve pokrenuti. U redu, pa pokrenite ssh, s nohupom, kako bismo se mogli spojiti na spremnik i vidjeti što je pošlo po zlu. Zatim pokrenite supervisor na isti način. Pa, onda samo vodite putnički put.
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 ponovno pokrenuti spremnik.
P: Ne zamaraj svoju glavu glupostima. I općenito, kako? Kako sve to izvoditi u jednom procesu? Neka Igor Ivanovič razmišlja o stabilnosti, nije uzalud što prima plaću. Naš posao je pisanje koda. I općenito, neka kaže hvala što smo napisali Dockefile za njega.

10 minuta i dva videa o mačkama kasnije.

P: Napravio sam sve. Dodao sam još komentara.
P: Pokaži mi!

Najnovija verzija Dockerfilea:

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, sviđa mi se. I komentari su na ruskom, zgodan i čitljiv, svatko bi tako radio. Sve sam te naučio, ostalo možeš sam. Idemo na kavu...

Pa, sada imamo savršeno užasan Dockerfile, od čijeg će pogleda Igor Ivanovich poželjeti odustati, a oči će ga boljeti još tjedan dana. Dockerfile bi, naravno, mogao biti još gori, nema granice savršenstvu. Ali za početak, ovo će poslužiti.

Želio bih završiti citatom Grigorija Ostera:

Ako još niste sigurni
Izabrali smo životni put,
A ne znaš zašto
Započnite svoj radni put,
Razbiti sijalice u hodnicima -
Ljudi će vam reći "hvala".
Pomoći ćeš narodu
Štedite električnu energiju.

Izvor: www.habr.com

Dodajte komentar