Docker: sfaturi dăunătoare

Docker: sfaturi dăunătoare

Când învățam să conduc, la prima mea lecție instructorul a ieșit pe o intersecție cu spatele și apoi mi-a spus că așa nu se face, niciodată. Această regulă am reținut-o instantaneu, pentru toată viața.

Când le citești copiilor „Sfaturi dăunătoare” de Grigori Oster, vezi cât de ușor și natural ajung la concluzia că așa nu se poate face.

Despre cum să scrii corect un Dockerfile s-au scris o mulțime de articole. Dar nu am găsit instrucțiuni despre cum să scrii Dockerfile-uri incorecte. Îmi completez acest gol. Și, poate, în proiectele pe care le primesc pentru suport, vor fi mai puține astfel de Dockerfile-uri.

Toți eroii, situațiile și Dockerfile-urile sunt fictive. Dacă te-ai recunoscut, îmi pare rău.

Să creăm un Dockerfile, sinistru și terifiant

Petr (Senior developer java/ruby/php): Colega Vasile, ai încărcat noul modul în Docker?
Vasile (junior): Nu, nu am reușit, nu mă descurc cu acest Docker. Atâtea articole despre el, îmi fug ochii.

Petr: Avem un termen limită care a expirat acum un an. Hai să te ajut, în timpul ăsta ne descurcăm. Zii-mi, ce anume nu îți iese.

Vasile: Nu pot alege o imagine de bază, să fie minimală, dar să conțină tot ce trebuie.
Petr: Ia imaginea ubuntu, are tot ce îți trebuie. Chiar dacă are multe lucruri suplimentare, vor fi utile mai târziu. Și nu uita să pui tag-ul latest, ca versiunea să fie întotdeauna cea mai recentă.

Și în Dockerfile apare prima linie:

FROM ubuntu:latest

Petr: Ce vine după, cu ce am scris modulul nostru?
Vasile: A, cu ruby, acolo trebuie să pornească un server web și câțiva demoni de serviciu.
Petr: Aha, ce ne trebuie: ruby, bundler, nodejs, imagemagick și ce mai e… Și în același timp, fă upgrade pentru a primi pachetele noi.
Vasile: Nu vom crea un utilizator, ca să nu lucrăm din root?
Petr: Păi, las-o așa, mai bine să nu ne complicăm cu permisiunile.
Vasile: Am nevoie de timp, vreo 15 minute, să pun totul într-o singură comandă, am citit că…
(Petr îl întrerupe brutal pe juniorul prea meticulos și deștept.)
Petr: Scrie comenzi separate, așa e mai ușor de citit.

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

Aici, în birou, intră Igor Ivanovici, DevOps (dar mai mult Ops, decât Dev), strigând:

II: Petya, developerii tăi au stricat din nou baza de date în producție, când se va termina asta…

După o mică ceartă, Igor Ivanovici se calmează și începe să afle ce fac colegii aici.

AI: Cu ce sunt ocupați?
Vasili: Petru mă ajută să compun un Dockerfile pentru noul modul.
AI: Lăsați-mă să arunc o privire... Ce ați scris aici, curățați repository-ul cu o echipă separată, este un strat suplimentar... Cum instalați dependențele dacă nu ați copiat Gemfile! Și, în general, nu merge așa.
Petru: Te rog, du-te cu treburile tale, ne descurcăm noi aici.

Igor Ivanovici oftează trist și pleacă să afle cine a stricat baza de date.

Petru: Da, dar a spus corect despre cod, trebuie să-l împachetăm în imagine. Și hai să instalăm ssh și supervisor imediat, altfel cum vom rula demonii.

Vasili: Atunci, voi copia mai întâi Gemfile și Gemfile.lock, apoi voi instala totul, și abia apoi voi copia întregul proiect. Dacă Gemfile nu se schimbă, stratul se va lua din cache.
Petru: De ce vă tot preocupați de aceste straturi, copiați totul deodată. Cumpărați-l direct. Primul rând.

Dockerfile-ul arată acum aș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
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/* 

Petru: Așa, ce urmează. Ai configurații pentru supervisor?
Vasili: Nu, n-am. Dar fac repede.
Petru: O vei face mai târziu. Hai să schițăm acum un script init care va porni totul. Așa, deci, pornești ssh, cu nohup, ca să ne putem conecta la container și să vedem ce a mers prost. Apoi, pornește și supervisorul. Și în final, pornești passenger.
V: Dar am citit că trebuie să fie un singur proces, astfel Docker va ști că ceva a mers prost și va putea reporni containerul.
P: Nu-ți mai încarci mintea cu prostii. Și cum? Cum vei rula totul într-un singur proces? Să se gândească Igor Ivanovici la stabilitate, nu degeaba primește salariul. Treaba noastră este să scriem cod. Și în general, să-i mulțumim că am scris Dockerfile-ul în locul lui.

După 10 minute și două videoclipuri cu pisici.

V: Am terminat tot. Am adăugat și câteva comentarii.
P: Arată-mi!

Versiunea actualizată a Dockerfile-ului:

FROM ubuntu:latest

# Copiem codul sursă
COPY .\/ \/app
WORKDIR \/app

# Actualizăm lista de pachete
RUN apt-get update 

# Actualizăm pachetele
RUN apt-get upgrade

# Instalăm pachetele necesare
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Instalăm bundler
RUN gem install bundler

# Instalăm nodejs folosit pentru a construi statica
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Instalăm dependențele
RUN bundle install --without development test --path vendor\/bundle

# Curățăm cache-ul
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Oprim scriptul, la pornirea containerului, care va lansa totul.
CMD ["\/app\/init.sh"]

P: Excelent, îmi place. Și comentariile în rusă, convenabil și citibil, toți ar trebui să lucreze așa. Te-am învățat tot, de acum vei putea singur. Hai să bem cafea...

Ei bine, iată că am obținut un Dockerfile perfect de horrible, de care Igor Ivanovici va dori să demisioneze și va avea ochii obosiți timp de o săptămână. Dockerfile-ul, desigur, ar fi putut fi și mai rău, nu există limită la perfecțiune. Dar pentru început, așa va fi suficient.

Aș dori să închei cu o citat de Grigori Oster:

Dacă încă nu ați decis ferm
Calea de viață pe care o alegeți,
Și nu știți de unde să începeți
Calea muncii voastre,
Spargeți becurile în scări —
Oamenii vă vor spune „Mulțumesc”.
Veți ajuta oamenii
Să economisească electricitatea.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster