Docker: rossz tanács

Docker: rossz tanács

Amikor autót tanultam vezetni, a legelső órán az oktató hátramenetben behajtott a kereszteződésbe, majd azt mondta, hogy ezt ne csináld – soha. Ez a szabály azonnal eszembe jutott, és egész életemre.

Elolvasod Grigory Oster „Rossz tanácsát” a gyerekeknek, és látod, milyen könnyen és természetesen tudatosul bennük, hogy ezt nem szabad megtenniük.

Sok cikket írtak arról, hogyan kell helyesen írni egy Docker-fájlt. De nem találkoztam utasításokkal a helytelen Docker-fájlok írására. Ezt a hiányt pótolom. És talán azokban a projektekben, amelyekben támogatást kapok, kevesebb lesz az ilyen docker-fájl.

Minden karakter, helyzet és Dockerfile fiktív. Ha felismered magad, elnézést.

Dockerfile létrehozása, baljóslatú és szörnyű

Péter (Senior java/rubby/php fejlesztő): Vaszilij kolléga, feltöltött már új modult a Dockerbe?
Vaszilij (junior): Nem, nem volt időm, nem tudom kitalálni ezzel a Dockerrel. Annyi cikk van róla, hogy szédítő.

Péter: Egy éve volt határidőnk. Hadd segítsek, menet közben kitaláljuk. Mondd el, mi nem megy neked.

Vaszilij: Nem tudok olyan alapképet választani, hogy minimális legyen, de minden benne van, ami kell.
Péter: Vegyük az ubuntu képet, minden benne van, ami kell. Ami pedig a sok felesleges dolog, az később jól jön. És ne felejtse el elhelyezni a legújabb címkét, hogy a verzió mindig a legújabb legyen.

És az első sor megjelenik a Dockerfile-ban:

FROM ubuntu:latest

Péter: Mi a következő lépés, mit használtunk a modulunk megírásához?
Vaszilij: Szóval ruby, van egy webszerver, és el kellene indítani néhány szolgáltatási démont.
Peter: Igen, mire van szükségünk: ruby, bundler, nodejs, imagemagick és mi más... És ugyanakkor frissíts, hogy biztosan új csomagokat kapjunk.
Vaszilij: És nem hozunk létre felhasználót, hogy ne legyünk root alatt?
Péter: Bassza meg, akkor még bolondoznia kell a jogokkal.
Vaszilij: Időre van szükségem, körülbelül 15 percre, hogy egy parancsba összeszedjem, azt olvastam...
(Péter durván félbeszakítja az aprólékos és nagyon okos juniort.)
Péter: Írj külön parancsokat, 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/*

Ekkor Igor Ivanovics, DevOps (de több operátor, mint Dev) beront az irodába, és kiabál:

AI: Petya, a fejlesztőid megint feltörték az élelmiszer-adatbázist, mikor lesz ennek vége...

Egy kisebb összetűzés után Igor Ivanovics lehűl, és elkezdi kideríteni, mit csinálnak itt kollégái.

AI: Mit csinálsz?
Vaszilij: Péter segít létrehozni egy Dockerfile-t egy új modulhoz.
AI: Hadd nézzem meg... Mit írtál ide, külön paranccsal tisztítod a tárolót, ez egy további réteg... De hogyan telepítsd a függőségeket, ha nem másoltad át a Gemfile-t! És általában ez nem jó.
Péter: Kérem, folytassa a dolgát, valahogy megoldjuk.

Igor Ivanovics szomorúan felsóhajt, és elmegy, hogy kiderítse, ki törte fel az adatbázist.

Péter: Igen, de igaza volt a kóddal kapcsolatban, bele kell tolnunk a képbe. És azonnal telepítsük az ssh-t és a supervisor-t, különben elindítjuk a démonokat.

Vaszilij: Akkor először átmásolom a Gemfile-t és a Gemfile.lock-ot, majd telepítek mindent, és utána másolom a teljes projektet. Ha a Gemfile nem változik, a réteg a gyorsítótárból kerül ki.
Péter: Miért vagy ezekkel a rétegekkel, másolj le mindent egyszerre. Azonnal másold. A legelső sor.

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: Szóval, mi lesz ezután? Vannak beállítások a felügyelőhöz?
Vaszilij: Nem, nem. De gyorsan megcsinálom.
Péter: Akkor megteszed. Most vázoljunk fel egy indító szkriptet, amely mindent elindít. Oké, akkor indítsd el az ssh-t a nohup-pal, hogy csatlakozhassunk a tárolóhoz, és megnézzük, mi a hiba. Ezután futtassa a supervisort ugyanúgy. Nos, akkor csak fuss utast.
K: De azt olvastam, hogy egy folyamatnak kell lennie, így a Docker tudni fogja, hogy valami hiba történt, és újraindíthatja a tárolót.
P: Ne fárassza a fejét hülyeségekkel. És általában hogyan? Hogyan lehet mindezt egy folyamatban futtatni? Igor Ivanovics gondoljon a stabilitásra, nem hiába kap fizetést. A mi feladatunk a kód írása. És általában, hadd köszönje meg, hogy megírtuk neki a Dockfile-t.

10 perc és két videó a macskákról később.

K: Mindent megtettem. További megjegyzéseket tettem hozzá.
P: Mutasd!

A Dockerfile legújabb verziója:

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: Remek, tetszik. A kommentek pedig orosz nyelvűek, kényelmesek és olvashatóak, mindenki így dolgozna. Mindenre megtanítottalak, a többit meg tudod csinálni magad. menjünk kávézni...

Nos, most van egy teljesen szörnyű Dockerfile, amelynek látványától Igor Ivanovics fel akar majd hagyni, és még egy hétig fájni fog a szeme. A Dockerfile persze lehetne még rosszabb is, a tökéletességnek nincs határa. De kezdetnek ez megteszi.

Egy idézettel szeretném befejezni Grigory Ostertől:

Ha még nem vagy biztos benne
Az élet útját választottuk,
És nem tudod miért
Indítsa el munka útját,
Törd szét a villanykörtéket a folyosókon -
Az emberek azt fogják mondani neked, hogy "Köszönöm".
Segíteni fogsz az embereknek
Takarítson meg áramot.

Forrás: will.com

Hozzászólás