Docker: un sfat prost

Docker: un sfat prost

Când învățam să conduc o mașină, la prima lecție instructorul a intrat în intersecție în marșarier și apoi a spus că nu ar trebui să faci asta - deloc. Mi-am amintit de această regulă imediat și pentru tot restul vieții.

Le-ai citit „Sfatul rău” de Grigory Oster copiilor și vezi cât de ușor și natural le-a dat seama că nu ar trebui să facă asta.

Au fost scrise o mulțime de articole despre cum să scrieți corect un Dockerfile. Dar nu am întâlnit instrucțiuni despre cum să scriu fișiere Dockerfile incorecte. Eu umplu acest gol. Și poate în proiectele pe care le primesc sprijin, vor fi mai puține astfel de fișiere docker.

Toate personajele, situațiile și Dockerfile sunt fictive. Dacă te recunoști, îmi pare rău.

Crearea unui Dockerfile, de rău augur și teribil

Peter (dezvoltator senior java/rubby/php): Colege Vasily, ai încărcat deja un nou modul în Docker?
Vasily (junior): Nu, nu am avut timp, nu pot să-mi dau seama cu acest Docker. Sunt atât de multe articole despre el, este amețitor.

Peter: Aveam un termen limită acum un an. Lasă-mă să te ajut, ne vom da seama în acest proces. Spune-mi ce nu funcționează pentru tine.

Vasily: Nu pot alege o imagine de bază, astfel încât să fie minimă, dar să aibă tot ce ai nevoie.
Peter: Ia imaginea ubuntu, are tot ce ai nevoie. Și ceea ce este o mulțime de lucruri inutile va veni la îndemână mai târziu. Și nu uitați să puneți cea mai recentă etichetă, astfel încât versiunea să fie întotdeauna cea mai recentă.

Și prima linie apare în fișierul Docker:

FROM ubuntu:latest

Peter: Ce urmează, ce am folosit pentru a ne scrie modulul?
Vasily: Deci, ruby, există un server web și ar trebui să fie lansate câțiva demoni de serviciu.
Peter: Da, de ce avem nevoie: ruby, bundler, nodejs, imagemagick și ce altceva... Și, în același timp, faceți un upgrade pentru a obține cu siguranță pachete noi.
Vasily: Și nu vom crea un utilizator ca să nu fim sub root?
Peter: La naiba, atunci mai trebuie să te prostești cu drepturile.
Vasily: Am nevoie de timp, vreo 15 minute, să pun totul laolaltă într-o singură comandă, am citit că...
(Peter îl întrerupe grosolan pe juniorul meticulos și foarte inteligent.)
Peter: Scrieți în comenzi separate, va fi mai ușor de citit.

Dockerfile crește:

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

Apoi Igor Ivanovich, DevOps (dar mai mult Ops decât Dev), iese în birou strigând:

AI: Petya, dezvoltatorii tăi au spart din nou baza de date cu alimente, când se va termina asta...

După o mică încăierare, Igor Ivanovici se răcește și începe să afle ce fac colegii săi aici.

AI: Ce faci?
Vasily: Peter mă ​​ajută să creez un Dockerfile pentru un modul nou.
AI: Lasă-mă să arunc o privire... Ce ai scris aici, curățați depozitul cu o comandă separată, acesta este un strat suplimentar... Dar cum instalezi dependențe dacă nu ai copiat Gemfile-ul! Și, în general, acest lucru nu este bun.
Peter: Te rog mergi la treaba ta, ne vom da seama cumva.

Igor Ivanovici oftă trist și pleacă să-și dea seama cine a spart baza de date.

Peter: Da, dar a avut dreptate în privința codului, trebuie să-l împingem în imagine. Și să instalăm imediat ssh și supervisor, altfel vom porni demonii.

Vasily: Atunci voi copia mai întâi Gemfile și Gemfile.lock, apoi voi instala totul și apoi voi copia întreg proiectul. Dacă Gemfile nu se modifică, stratul va fi luat din cache.
Peter: De ce sunteți toți cu aceste straturi, copiați totul deodată. Copiați imediat. Chiar prima linie.

Dockerfile acum arată astfel:

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: Deci, ce urmează? Aveți configurații pentru supervizor?
Vasily: Nu, nu. Dar o voi face repede.
Peter: Atunci o vei face. Să schițăm acum un script init care va lansa totul. Bine, deci începeți ssh, cu nohup, ca să ne putem conecta la container și să vedem ce a mers prost. Apoi conduceți supervizorul în același mod. Ei bine, atunci pur și simplu alergi pasager.
Î: Dar am citit că ar trebui să existe un singur proces, așa că Docker va ști că ceva a mers prost și poate reporni containerul.
P: Nu-ți deranja capul cu prostii. Și în general, cum? Cum rulezi toate acestea într-un singur proces? Lăsați-l pe Igor Ivanovici să se gândească la stabilitate, nu degeaba primește un salariu. Treaba noastră este să scriem cod. Și, în general, lăsați-l să vă mulțumească că am scris Dockefile pentru el.

10 minute și două videoclipuri despre pisici mai târziu.

Î: Am făcut totul. Am adăugat mai multe comentarii.
P: Arată-mi!

Ultima versiune de 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, îmi place. Și comentariile sunt în rusă, convenabile și lizibile, toată lumea ar funcționa așa. Te-am învățat totul, restul îl poți face singur. Hai sa bem o cafea...

Ei bine, acum avem un Dockerfile perfect groaznic, a cărui vedere îl va face pe Igor Ivanovich să vrea să renunțe și îi va doare ochii încă o săptămână. Dockerfile, desigur, ar putea fi și mai rău, nu există limită pentru perfecțiune. Dar pentru început, acest lucru va funcționa.

Aș dori să închei cu un citat din Grigory Oster:

Dacă încă nu ești sigur
Am ales calea în viață,
Și nu știi de ce
Începeți călătoria muncii,
Sparge becurile de pe holuri -
Oamenii îți vor spune „Mulțumesc”.
Vei ajuta oamenii
Economisiți energie electrică.

Sursa: www.habr.com

Adauga un comentariu