Docker: slab nasvet

Docker: slab nasvet

Ko sem se učil voziti avto, je inštruktor že na prvi uri zapeljal v križišče vzvratno, potem pa rekel, da tega ne smeš početi – sploh nikoli. To pravilo sem si zapomnil takoj in za vse življenje.

Otrokom berete »Slabe nasvete« Grigorija Osterja in vidite, kako enostavno in naravno se jim posveti, da tega ne bi smeli početi.

O tem, kako pravilno napisati Dockerfile, je bilo napisanih veliko člankov. Nisem pa naletel na navodila, kako napisati napačne datoteke Docker. Zapolnjujem to vrzel. In morda bo v projektih, ki jih podpiram, manj takih docker datotek.

Vsi liki, situacije in Dockerfile so izmišljeni. Če se prepoznaš, se opravičujem.

Ustvarjanje datoteke Docker, zlovešče in strašno

Peter (starejši java/rubby/php razvijalec): Kolega Vasilij, ste že naložili nov modul v Docker?
Vasilij (mlajši): Ne, nisem imel časa, ne morem ugotoviti s tem Dockerjem. O tem je toliko člankov, da je vrtoglavo.

Peter: Pred enim letom smo imeli rok. Naj vam pomagam, to bomo ugotovili med postopkom. Povej mi, kaj ti ne ustreza.

Vasily: Ne morem izbrati osnovne slike, tako da bi bila minimalna, vendar bi imela vse, kar potrebujete.
Peter: Vzemi sliko ubuntu, ima vse, kar potrebuješ. In kar je veliko nepotrebnih stvari, vam bo kasneje prišlo prav. In ne pozabite dodati najnovejše oznake, da bo različica vedno najnovejša.

In prva vrstica se pojavi v datoteki Dockerfile:

FROM ubuntu:latest

Peter: Kaj je naslednje, kaj smo uporabili za pisanje našega modula?
Vasily: Torej ruby, obstaja spletni strežnik in nekaj servisnih demonov je treba zagnati.
Peter: Ja, kaj rabimo: ruby, bundler, nodejs, imagemagick in še kaj... In hkrati narediti nadgradnjo, da zagotovo dobimo nove pakete.
Vasily: In ne bomo ustvarili uporabnika, da ne bomo root?
Peter: Jebiga, potem se moraš še norčevati s pravicami.
Vasily: Potrebujem čas, približno 15 minut, da vse skupaj združim v en ukaz, to sem prebral ...
(Peter nesramno prekine natančnega in zelo pametnega mladinca.)
Peter: Pišite v ločenih ukazih, lažje bo branje.

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

Nato Igor Ivanovič, DevOps (vendar bolj Ops kot Dev), vdre v pisarno in kriči:

AI: Petja, tvoji razvijalci so spet vdrli v bazo hrane, kdaj se bo to končalo ...

Po manjšem spopadu se Igor Ivanovič ohladi in začne ugotavljati, kaj njegovi kolegi počnejo tukaj.

AI: Kaj delaš?
Vasily: Peter mi pomaga ustvariti Dockerfile za nov modul.
AI: Naj pogledam ... Kaj si tukaj napisal, repozitorij očistiš z ločenim ukazom, to je dodatna plast ... Kako pa namestiti odvisnosti, če nisi kopiral Gemfile! In na splošno to ni dobro.
Peter: Prosim, pojdi po svojem poslu, že bomo že nekako ugotovili.

Igor Ivanovič žalostno vzdihne in odide, da bi ugotovil, kdo je vdrl v bazo podatkov.

Peter: Da, vendar je imel prav glede kode, potisniti jo moramo v sliko. In takoj namestimo ssh in supervisor, drugače bomo zagnali demone.

Vasily: Potem bom najprej kopiral Gemfile in Gemfile.lock, nato bom vse namestil in nato bom kopiral celoten projekt. Če se datoteka Gemfile ne spremeni, bo plast vzeta iz predpomnilnika.
Peter: Zakaj ste vsi s temi sloji, kopirajte vse naenkrat. Kopiraj takoj. Čisto prva vrstica.

Dockerfile zdaj izgleda takole:

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: Kaj pa potem? Ali imate konfiguracije za nadzornika?
Vasilij: Ne, ne. Ampak bom hitro naredil.
Peter: Potem boš naredil. Zdaj skicirajmo zagonski skript, ki bo vse zagnal. V redu, torej zaženete ssh z nohup, da se lahko povežemo z vsebnikom in vidimo, kaj je šlo narobe. Nato na enak način zaženite nadzornika. No, potem samo vodiš potnika.
V: Vendar sem prebral, da bi moral obstajati en postopek, tako da bo Docker vedel, da je šlo nekaj narobe, in lahko znova zažene vsebnik.
P: Ne delaj si glave z neumnostmi. In na splošno, kako? Kako vse to izvajati v enem procesu? Naj Igor Ivanovič razmišlja o stabilnosti, ni zaman, da prejema plačo. Naša naloga je pisanje kode. In na splošno naj se zahvali, da smo zanj napisali Dockefile.

10 minut in dva videa o mačkah kasneje.

V: Vse sem naredil. Dodal sem več komentarjev.
P: Pokaži mi!

Najnovejša različica 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, všeč mi je. In komentarji so v ruščini, priročni in berljivi, vsi bi delali tako. Vsega sem te naučil, ostalo lahko narediš sam. Greva na kavo...

No, zdaj imamo popolnoma grozen Dockerfile, ob pogledu na katerega bo Igor Ivanovič želel odnehati in ga bodo oči bolele še en teden. Dockerfile bi seveda lahko bil še slabši, popolnosti ni meja. Ampak za začetek bo to dovolj.

Končal bi s citatom Grigorija Osterja:

Če še niste prepričani
Izbrali smo pot v življenju,
In ne veš zakaj
Začnite svojo porodno pot,
Razbijte žarnice na hodnikih -
Ljudje vam bodo rekli "hvala".
Pomagal boš ljudem
Varčujte z elektriko.

Vir: www.habr.com

Dodaj komentar