Docker: halb nõuanne

Docker: halb nõuanne

Kui õppisin autot juhtima, sõitis instruktor kohe esimesel tunnil tagurpidi ristmikule ja ütles siis, et te ei tohiks seda teha - mitte kunagi. See reegel tuli mulle kohe meelde ja kogu eluks.

Loed lastele Grigory Osteri “Halba nõu” ja näed, kui kergesti ja loomulikult jõuab neile kohale, et nad ei peaks seda tegema.

Dockerfile'i korrektse kirjutamise kohta on kirjutatud palju artikleid. Kuid ma ei leidnud juhiseid valede Docker-failide kirjutamise kohta. Täidan selle tühimiku. Ja võib-olla on nendes projektides, mida ma toetust saan, selliseid dockerfile vähem.

Kõik tegelased, olukorrad ja Dockerfile on fiktiivsed. Kui tunned end ära, siis vabandust.

Dockeri faili loomine, kurjakuulutav ja kohutav

Peter (vanem java/rubby/php arendaja): Kolleeg Vassili, kas olete juba uue mooduli Dockeri üles laadinud?
Vassili (juunior): Ei, mul ei olnud aega, ma ei saa selle Dockeriga sellest aru. Selle kohta on nii palju artikleid, see on peadpööritav.

Peeter: Meil ​​oli tähtaeg aasta tagasi. Las ma aitan teid, me selgitame selle protsessi käigus välja. Ütle mulle, mis sinu jaoks ei tööta.

Vassili: Ma ei saa valida põhipilti nii, et see oleks minimaalne, kuid sisaldab kõike, mida vajate.
Peter: Võtke ubuntu pilt, sellel on kõik, mida vajate. Ja see, mis on palju mittevajalikke asju, tuleb hiljem kasuks. Ja ärge unustage lisada uusimat silti, et versioon oleks alati uusim.

Ja esimene rida kuvatakse Dockerfile'is:

FROM ubuntu:latest

Peter: Mis edasi, mida kasutasime oma mooduli kirjutamiseks?
Vassili: Nii et rubiin, veebiserver on olemas ja paar teenindusdeemonit tuleks käivitada.
Peter: Jah, mida me vajame: ruby, bundler, nodejs, imagemagick ja mida veel... Ja samal ajal tehke uuendus, et kindlasti uusi pakette hankida.
Vassili: Ja me ei loo kasutajat selleks, et me ei oleks juure all?
Peeter: Persse, siis pead ikka õigustega narrima.
Vassili: Mul on vaja aega, umbes 15 minutit, et see kõik üheks käsuks kokku panna, lugesin, et...
(Peeter katkestab hoolikalt ja väga targa juuniori.)
Peeter: Kirjutage eraldi käsud, siis on lihtsam lugeda.

Dockerfile kasvab:

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

Siis tungib kontorisse Igor Ivanovitš, DevOps (aga rohkem operatsioone kui arendaja), karjudes:

AI: Petya, teie arendajad rikkusid taas toiduandmebaasi, millal see lõpeb...

Pärast väikest tüli jahtub Igor Ivanovitš ja hakkab uurima, mida tema kolleegid siin teevad.

AI: Mida sa teed?
Vassili: Peter aitab mul luua uue mooduli jaoks Dockerfile'i.
AI: Lubage mul vaadata... Mida sa siia kirjutasid, puhastate hoidla eraldi käsuga, see on lisakiht... Aga kuidas installite sõltuvusi, kui te pole Gemfile'i kopeerinud! Ja üldiselt pole see hea.
Peeter: Palun tehke oma asju, me saame selle kuidagi välja.

Igor Ivanovitš ohkab kurvalt ja lahkub uurima, kes andmebaasi rikkus.

Peter: Jah, aga tal oli koodi osas õigus, me peame selle pildi sisse suruma. Ja installime kohe ssh ja supervisor, muidu käivitame deemonid.

Vassili: Seejärel kopeerin esmalt failid Gemfile ja Gemfile.lock, seejärel installin kõik ja seejärel kopeerin kogu projekti. Kui Gemfile ei muutu, võetakse kiht vahemälust.
Peeter: Miks te kõik nende kihtidega olete, kopeerige kõik korraga. Kopeerige kohe. Kõige esimene rida.

Dockerfile näeb nüüd välja selline:

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

Peeter: Mis siis edasi? Kas teil on juhendaja konfiguratsioonid?
Vassili: Ei, ei. Aga ma teen seda kiiresti.
Peeter: Siis sa teed seda. Nüüd visandame välja algskripti, mis käivitab kõik. Olgu, käivitage ssh koos nohupiga, et saaksime konteineriga ühenduse luua ja vaadata, mis valesti läks. Seejärel käivitage supervisor samamoodi. Noh, siis jooksete lihtsalt reisija.
K: Aga ma lugesin, et peaks olema üks protsess, nii et Docker teab, et midagi läks valesti, ja saab konteineri taaskäivitada.
P: Ära vaeva oma pead lollusega. Ja üldiselt, kuidas? Kuidas seda kõike ühes protsessis läbi viia? Mõelgu Igor Ivanovitš stabiilsusele, ta ei saa asjata palka. Meie töö on koodi kirjutamine. Ja üldiselt las ta tänab, et me tema jaoks Dockfile'i kirjutasime.

10 minutit ja hiljem kaks videot kassidest.

K: Ma olen kõike teinud. Lisasin veel kommentaare.
P: Näita mulle!

Dockerfile'i uusim versioon:

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: Tore, mulle meeldib. Ja kommentaarid on venekeelsed, mugavad ja loetavad, kõik töötaksid nii. Ma õpetasin teile kõike, ülejäänu saate ise teha. Lähme joome kohvi...

Noh, nüüd on meil täiesti kohutav Dockerfile, mille nägemine paneb Igor Ivanovitši tahtma lõpetada ja ta silmad hakkavad veel nädalaks valutama. Dockerfile võiks muidugi veel hullem olla, täiuslikkusele pole piire. Aga alustuseks see sobib.

Tahaksin lõpetada tsitaadiga Grigory Osterilt:

Kui te pole veel kindel
Valisime elutee,
Ja sa ei tea, miks
Alusta oma tööteed,
Lõhkuge koridorides lambid -
Inimesed ütlevad teile "aitäh".
Sa aitad rahvast
Säästke elektrit.

Allikas: www.habr.com

Lisa kommentaar