Docker: kaitīgas rekomendācijas

Docker: kaitīgas rekomendācijas

Kad es mācījos braukt ar mašīnu, pirmajā nodarbībā instruktors izbrauca krustojumā atpakaļgaitā un pēc tam teica, ka tā darīt nedrīkst — nekad vispār. To es nodomāju uzreiz un uz visu mūžu.

Lasot bērniem Grigorija Ostera "Kaitīgus padomus", redzi, cik viegli un dabiski viņiem nonāk, ka tā darīt nedrīkst.

Ir uzrakstīts daudz rakstu par to, kā pareizi rakstīt Dockerfile. Bet man nav sanācis sastapt instrukcijas, kā rakstīt nepareizos Dockerfile. Es aizpildīšu šo robu. Un, varbūt, projektu, kuriem es sniedzu atbalstu, šādu dockerfile kļūs mazāk.

Visi varoņi, situācijas un Dockerfile ir izdomāti. Ja jūs sevi atpazīstat, atvainojiet.

Izveidojam Dockerfile, ļaunu un šausminošu.

Pēteris (Senior java/ruby/php izstrādātājs): Kolēģi Vasīlij, vai tu jau esi augšupielādējis Docker jaunā moduli?
Vasīlijs (junior): Nē, nesanāca, es joprojām nesaprotu šo Docker. Tik daudz rakstu, acis skrien.

Pēteris: Mums termiņš beidzās jau pirms gada. Nāc, es palīdzēšu, procesā izpratīsim. Stāsti, kas tev nesanāk.

Vasīlijs: Es nevaru izvēlēties pamatattēlu, lai tas būtu minimāls, bet lai būtu viss nepieciešamais.
Pēteris: Ņem ubuntu attēlu, tajā ir viss nepieciešamais. Un, ja ir daudz lieka, tas vēl noderēs. Un neaizmirsti uzstādīt tagnu latest, lai versija vienmēr būtu visjaunākā.

Un Dockerfile parādās pirmajā rindā:

FROM ubuntu:latest

Pēteris: Kas ir tālāk, uz kā mēs rakstījām mūsu moduli?
Vasīlijs: Tā taču ir ruby, tur jāpalaiž tīmekļa serveris un pāris pakalpojumu aģenti.
Pēteris: Aha, kas mums ir nepieciešams: ruby, bundler, nodejs, imagemagick, nu un kas tur vēl... Un uzreiz uztaisi uzlabojumu, lai noteikti iegūtu jaunus pakotnes.
Vasīlijs: Vai mēs neveidosim lietotāju, lai tas nebūtu zem root?
Pēteris: Nevajag, pēc tam vēl jāpārbauda tiesības.
Vasīlijs: Man vajag laiku, apmēram 15 minūtes, lai saliktu to visu vienā komandā, es lasīju, ka...
(Pēteris rupji pārtrauc pārdomātu un uzstājīgu jaunāko izstrādātāju.)
Pēteris: Raksti atsevišķās komandās, tā būs vieglāk izlasīt.

Dockerfile aug:

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

Tajā laikā kabinetā iebrūk Igors Ivanovičs, DevOps (bet vairāk Ops nekā Dev), kliedzot:

II: Petja, tavi izstrādātāji vēlreiz sabojāja ražošanas datubāzi, kad tas beigsies...

Pēc nelielas strīda Igors Ivanovičs atdziest un sāk noskaidrot, ar ko kolēģi šeit nodarbojas.

AI: Ar ko esat aizņemti?
Vasiļijs: Pēteris man palīdz sastādīt Dockerfile jaunajam modulim.
AI: Dodies paskatīties… Bet ko jūs te esat sarakstījuši, jūs taču tīrāt repozitoriju ar atsevišķu komandu, tas taču ir papildu slānis… Bet kā jūs uzstādat atkarības, ja neesat kopējuši Gemfile! Un vispār, tas nav nekam nederīgs.
Pēteris: Lūdzu, dodieties pie savām lietām, mēs te kaut kā tiksim galā.

Igors Ivanovičs skumji nopūšas un dodas izpētīt, kurš tieši salauza DB.

Pēteris: Jā, bet par kodu viņš teica pareizi, jāievieto to attēlā. Un lai uzreiz uzstādam ssh un supervisor, citādi kā mēs palaidīsim dēmonus.

Vasiļijs: Es tad vispirms kopēšu Gemfile un Gemfile.lock, pēc tam visu uzstādīšu, un pēc tam jau kopēšu visu projektu. Ja Gemfile nemainās, slānis tiks ņemts no keša.
Pēteris: Ko jūs visi ar šiem slāņiem, kopējiet uzreiz visu. Kopējiet uzreiz. Pirmā rindiņa.

Dockerfile tagad izskatās tā:

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

Pēteris: Nu, kas tālāk. Vai tev ir konfigurācijas supervisor?
Vasiļijs: Nē, nav. Bet es ātri izveidošu.
Pēteris: Pēc tam izveidosi. Dodies tagad uzrakstīt init skriptu, kas visu palaidīs. Tātad, tu palaidīsi ssh, ar nohup, lai mēs varētu pieslēgties konteinera un paskatīties, kas ne tā aizgāja. Pēc tam tāpat palaidīsi supervisor. Un pēc tam vienkārši palaidīsi passenger.
V: Bet es lasīju, ka jābūt vienam procesam, tad Docker zinās, ka kaut kas nav kārtībā un varēs restartēt konteineru.
P: Neuztraucies par muļķībām. Un vispār, kā? Kā tu to visu palaidīsi vienā procesā? Lai par stabilitāti domā Igors Ivanovičs, nav jau velti viņš saņem algu. Mūsu darbs ir rakstīt kodu. Un vispār, lai saka paldies, ka mēs viņam uzrakstījām Dockerfile.

Pagaidām 10 minūtes un divi video par kaķiem.

V: Es visu izdarīju. Vēl komentārus pievienoju.
P: Rādiet!

Jaunākā versija Dockerfile:

FROM ubuntu:latest

# Pārsūtām avota kodu
COPY .\/ \/app
WORKDIR \/app

# Atjauninām pakotņu sarakstu
RUN apt-get update 

# Atjauninām pakotnes
RUN apt-get upgrade

# Instalējam nepieciešamās pakotnes
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Instalējam bundler
RUN gem install bundler

# Instalējam nodejs, kas tiek izmantots statikas apkopošanai
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Instalējam atkarības
RUN bundle install --without development test --path vendor\/bundle

# Notīrām kešus
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Izpildām skriptu, kad konteiners startējas, kas uzsāks visu pārējo.
CMD ["\/app\/init.sh"]

P: Lieliski, man patīk. Un komentāri krieviski, ērti un saprotami, visi tā strādātu. Es tevi visu iemācīju, turpmāk vari pats. Atnāksim padzert kafiju...

Nu, lūk, mēs ieguvām ideāli briesmīgu Dockerfile, no kura Ivars Ivanovičs gribēs atlaist un acis vēl nedēļu sāpēs. Dockerfile, protams, varēja būt vēl sliktāks, nav robežu pilnībai. Bet, lai sāktu, tā arī der.

Beigt gribētos ar Grigorija Ostera citātu:

Ja jūs vēl neesat stingri
Izvēlējušies ceļu dzīvē,
Un nezināt, ar ko sākt
Savus darba ceļus,
Sistiet lampiņas kāpņu telpās —
Cilvēki jums teiks "Paldies".
Jūs palīdzēsiet tautai
Elektrību taupīt.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster