Docker: káros tanácsok

Docker: káros tanácsok

Amikor megtanultam vezetni, az első órán az oktató hátramenetben kiment a kereszteződésbe, majd azt mondta, hogy ezt soha, de soha nem szabad csinálni. Ezt a szabályt azonnal megjegyeztem, és életem végéig emlékezni fogok rá.

Olvasol a gyerekeknek Grigori Oszter "Ártalmas tanácsok" című könyvéből, és látod, mennyire könnyedén és magától értetődően jut el hozzájuk, hogy ezt nem szabad csinálni.

Számos cikk született arról, hogyan kell helyesen megírni a Dockerfile-t. De eddig nem találkoztam útmutatókkal a rossz Dockerfile-ok írásáról. Ezt a hiányosságot pótolom. Talán a támogatásom alá került projektekben kevesebb ilyen dockerfile fog szerepelni.

Minden szereplő, helyzet és Dockerfile kitalált. Ha magadra ismersz, sajnálom.

Hozzuk létre a Dockerfile-t, félelmetes és borzasztó

Péter (Senior java/ruby/php fejlesztő): Kolléga Vaszilij, feltöltötted már az új modult Dockerbe?
Vaszilij (junior): Nem, nem értem rá, egyszerűen nem tudok megbirkózni ezzel a Dockerrel. Olyan sok cikket olvastam róla, hogy az ember szeme szétfut.

Péter: Nekünk már egy éve lejárt a határidő. Segítek neked, közben megértjük, hogy mi a probléma.

Vaszilij: Nem tudom kiválasztani az alapképet, hogy minimális legyen, de mégis minden szükséges legyen.
Péter: Válaszd az ubuntu képet, abban minden benne van, amire szükséged van. És ha van benne sok felesleges, majd később hasznos lesz. Ne felejtsd el betenni a legfrissebb verziót, hogy mindig a legújabb legyen.

És a Dockerfile első sora megjelenik:

FROM ubuntu:latest

Péter: Mi jön ezután, mivel írtuk a modulunkat?
Vaszilij: Hát ruby, ott webservernek és egy pár segéd démonnak kell futnia.
Péter: Rendben, amire szükségünk van: ruby, bundler, nodejs, imagemagick, és még ott van valami... És ráadásul, csinálj upgrade-et, hogy biztosan új csomagokat kapj.
Vaszilij: Nem fogunk felhasználót létrehozni, hogy ne rootból kelljen, igaz?
Péter: Hagyjuk ezt, később ugyan még bajlódhatunk a jogosultságokkal.
Vaszilij: Szükségem van egy kis időre, körülbelül 15 percre, hogy mindezt egy parancsba összehozzam, olvastam, hogy...
(Péter durván félbeszakítja a makacs és túl okos junior-t.)
Péter: Írd külön parancsokba, úgy könnyebb lesz olvasni.

A Dockerfile növekszik:

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

Ebben a pillanatban belép Igor Ivanovics, DevOps (de inkább Ops, mint Dev), kiáltással:

II: Petya, a fejlesztőid megint összetörték a termelési adatbázist, mikor fog ez végre véget érni....

Miután egy kis veszekedés után Igor Ivanovics megnyugszik, és elkezdi kideríteni, mivel foglalkoznak a kollégái.

AI: Mivel foglalkoznak?
Vaszilij: Péter segít nekem elkészíteni a Dockerfile-t az új modulhoz.
AI: Hagy nézzem... Hát, mit írtak itt, hiszen a repository-t külön parancsmal takarítják ki, ez pedig egy plusz réteg... De hogyan állítják be a függőségeket, ha nem másolták át a Gemfile-t? És egyáltalán, ez így nem működik.
Péter: Kérem, menjen a dolgaira, mi itt valahogy megbirkózunk.

Igor Ivanovics sóhajt egy nagyot, és elmegy kideríteni, ki is törte el az adatbázist.

Péter: Igen, de a kódra igaza van, azt be kell tenni a képbe. És állítsuk be az ssh-t és a supervisort, mert hogyan fogjuk elindítani a démonokat.

Vaszilij: Akkor először lemásolom a Gemfile-t és a Gemfile.lock-ot, aztán mindent telepítek, és csak utána másolom át az egész projektet. Ha a Gemfile nem változik, a réteg a cache-ből fog jönni.
Péter: Miért foglalkozol mindezen rétegekkel, másold át mindet egyszerre. Az első sorban mindent másolj.

A Dockerfile most így néz ki:

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éter: Na, mi a következő. Van configod a supervisorhoz?
Vaszilij: Nem, nincs. De gyorsan elkészítem.
Péter: Majd később csinálod. Most vázoljunk fel egy init scriptet, ami mindent elindít. Nos, indítod az ssh-t, nohup-pel, hogy csatlakozhassunk a konténerhez, és megnézhessük, mi ment rosszul. Aztán indítsd a supervisort is. Nos, és utána egyszerűen elindítod a passengert.
V: De olvastam, hogy egyetlen folyamatnak kell lennie, így a Docker tudja, hogy valami rosszul ment, és újra tudja indítani a konténert.
P: Ne foglalkozz ilyen hülyeségekkel. Egyáltalán, hogyan? Hogyan indítanád el mindezt egy folyamatban? Az legyen Igor Ivanovics dolga, hogy a stabilitásért feleljen, nem véletlenül kap fizetést. Nekünk az a dolgunk, hogy kódoljunk. Egyáltalán, hadd mondja meg, hogy köszönje meg, hogy elkészítettük neki a Dockerfile-t.

Tíz perc és két cicás videó múlva.

V: Minden készen van. Még néhány megjegyzést is hozzátettem.
P: Mutasd!

A Dockerfile frissített verziója:

FROM ubuntu:latest

# A forráskód másolása
COPY .\/ \/app
WORKDIR \/app

# A csomagok lista frissítése
RUN apt-get update 

# A csomagok frissítése
RUN apt-get upgrade

# A szükséges csomagok telepítése
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# A bundler telepítése
RUN gem install bundler

# A nodejs telepítése, ami a statikus fájlok építéséhez szükséges
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# A függőségek telepítése
RUN bundle install --without development test --path vendor\/bundle

# A gyorsítótárak takarítása
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Indítsuk el a szkriptet a konténer indításakor, amely elindítja a többit.
CMD ["\/app\/init.sh"]

P: Remek, tetszik. Az orosz nyelvű megjegyzések hasznosak és olvashatóak, mindenki így dolgozna. Mindent megtanítottam neked, most már saját magad is boldogulsz. Induljunk kávézni...

Nos, megkaptuk a tökéletesen borzalmas Dockerfile-t, amelytől Igor Ivanovics el akar majd küldeni, és még egy hétig fájni fog a szeme. A Dockerfile természetesen lehetett volna még rosszabb is, a tökéletesség határtalan. De kezdetnek ez is megteszi.

Szeretném befejezni Grigori Oster egyik idézetével:

Ha még nem döntötte el határozottan
Melyik utat választja az életben,
És nem tudja, mivel kezdje
A munkás életét,
Kopogtasson a villanykörtékbe —
Az emberek azt fogják mondani: „Köszönöm.”
Segíteni fog az embereknek
Megőrizni az áramot.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster