Docker: slikts padoms

Docker: slikts padoms

Kad es mācījos braukt ar mašīnu, pašā pirmajā nodarbībā instruktors iebrauca krustojumā atpakaļgaitā, un tad teica, ka nevajag tā darīt - nekad. Šo noteikumu es atcerējos uzreiz un visu mūžu.

Jūs lasāt bērniem Grigorija Ostera “Sliktos padomus” un redzat, cik viegli un dabiski viņiem ienāk prātā, ka viņiem to nevajadzētu darīt.

Ir rakstīts daudz rakstu par to, kā pareizi uzrakstīt Dockerfile. Bet es nesaņēmu norādījumus, kā rakstīt nepareizus Dockerfiles. Es aizpildu šo robu. Un varbūt tajos projektos, kurus saņemu atbalstu, tādu dokerfailu būs mazāk.

Visi varoņi, situācijas un Dockerfile ir izdomāti. Ja atpazīsti sevi, atvainojos.

Dockerfile izveide, draudīgs un briesmīgs

Pēteris (vecākais java/rubby/php izstrādātājs): Kolēģi Vasīlij, vai esat jau augšupielādējis jaunu moduli Docker?
Vasilijs (jaunākais): Nē, man nebija laika, es nevaru to izdomāt ar šo Docker. Par to ir tik daudz rakstu, ka tas ir reibinoši.

Pēteris: Mums bija termiņš pirms gada. Ļaujiet man jums palīdzēt, mēs to izdomāsim procesa laikā. Pastāsti man, kas tev neder.

Vasīlijs: Es nevaru izvēlēties pamata attēlu, lai tas būtu minimāls, bet tajā būtu viss nepieciešamais.
Pēteris: Paņemiet ubuntu attēlu, tajā ir viss nepieciešamais. Un tas, kas ir daudz nevajadzīgu lietu, noderēs vēlāk. Un neaizmirstiet ievietot jaunāko tagu, lai versija vienmēr būtu jaunākā.

Un pirmā rinda parādās Dockerfile:

FROM ubuntu:latest

Pēteris: Kas tālāk, ko mēs izmantojām, lai uzrakstītu savu moduli?
Vasilijs: Tātad, ir tīmekļa serveris, un vajadzētu palaist pāris pakalpojumu dēmonus.
Pēteris: Jā, ko mums vajag: rubīns, bundler, nodejs, imagemagick un kas vēl... Un tajā pašā laikā veiciet jaunināšanu, lai noteikti iegūtu jaunas pakotnes.
Vasilijs: Un mēs neveidosim lietotāju, lai mēs nebūtu zem root?
Pēteris: Bāc, tad vēl jāblēnās ar tiesībām.
Vasīlijs: Man vajag laiku, apmēram 15 minūtes, lai to visu apvienotu vienā komandā, es izlasīju, ka...
(Pīters rupji pārtrauc sīkumaino un ļoti gudro junioru.)
Pēteris: Raksti atsevišķās komandās, būs vieglāk lasī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/*

Tad Igors Ivanovičs, DevOps (bet vairāk ops nekā Dev), ieplūst birojā, kliedzot:

AI: Petja, jūsu izstrādātāji atkal salauza pārtikas datu bāzi, kad tas beigsies...

Pēc neliela sadursmes Igors Ivanovičs atdziest un sāk noskaidrot, ko viņa kolēģi šeit dara.

AI: Ko tu dari?
Vasilijs: Pēteris man palīdz izveidot Dockerfile jaunam modulim.
AI: Ļaujiet man apskatīties... Ko jūs šeit rakstījāt, jūs iztīrāt repozitoriju ar atsevišķu komandu, tas ir papildu slānis... Bet kā instalēt atkarības, ja neesat nokopējis Gemfile! Un kopumā tas nav labi.
Pēteris: Lūdzu, dariet savu biznesu, mēs to kaut kā izdomāsim.

Igors Ivanovičs skumji nopūšas un aiziet, lai noskaidrotu, kurš uzlauzis datubāzi.

Pēteris: Jā, bet viņam bija taisnība par kodu, mums tas jāiespiež attēlā. Un nekavējoties instalēsim ssh un supervisor, pretējā gadījumā mēs sāksim dēmonus.

Vasīlijs: Tad es vispirms nokopēšu Gemfile un Gemfile.lock, pēc tam visu instalēšu un pēc tam kopēšu visu projektu. Ja Gemfile nemainās, slānis tiks noņemts no kešatmiņas.
Pēteris: Kāpēc jūs visi esat ar šiem slāņiem, kopējiet visu uzreiz. Nekavējoties nokopējiet. Pati pirmā rinda.

Dockerfile tagad izskatās šādi:

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: Un kas tālāk? Vai jums ir supervizora konfigurācijas?
Vasilijs: Nē, nē. Bet es to izdarīšu ātri.
Pēteris: Tad tu to darīsi. Tagad ieskicēsim init skriptu, kas palaidīs visu. Labi, sāciet ssh ar nohup, lai mēs varētu izveidot savienojumu ar konteineru un redzēt, kas nogāja greizi. Pēc tam palaidiet supervizoru tādā pašā veidā. Nu, tad jūs vienkārši palaist pasažieri.
J: Bet es izlasīju, ka ir jābūt vienam procesam, tāpēc Docker zinās, ka kaut kas nogāja greizi, un var restartēt konteineru.
P: Netraucē savu galvu ar muļķībām. Un vispār, kā? Kā to visu vadīt vienā procesā? Lai Igors Ivanovičs domā par stabilitāti, ne velti viņš saņem algu. Mūsu uzdevums ir rakstīt kodu. Un vispār, ļaujiet viņam pateikt paldies, ka mēs viņam uzrakstījām Dockefile.

10 minūtes un divi video par kaķiem vēlāk.

J: Es esmu izdarījis visu. Pievienoju vēl komentārus.
P: Parādi man!

Jaunākā Dockerfile versija:

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: Lieliski, man patīk. Un komentāri ir krievu valodā, ērti un lasāmi, visi tā strādātu. Es tev visu iemācīju, pārējo vari izdarīt pats. Ejam iedzert kafiju...

Nu, tagad mums ir pilnīgi briesmīgs Dockerfile, kuru redzot, Igoram Ivanovičam radīsies vēlme atmest un viņam sāpēs acis vēl nedēļu. Protams, Dockerfile varētu būt vēl sliktāks, pilnībai nav ierobežojumu. Bet iesākumam tas derēs.

Es vēlētos beigt ar Grigorija Ostera citātu:

Ja vēl neesat pārliecināts
Mēs izvēlējāmies ceļu dzīvē,
Un jūs nezināt, kāpēc
Sāciet savu darba ceļu,
Salauzt spuldzes gaiteņos -
Cilvēki jums pateiks "Paldies".
Jūs palīdzēsiet cilvēkiem
Taupiet elektrību.

Avots: www.habr.com

Pievieno komentāru