Docker: schlecht Rotschléi

Docker: schlecht Rotschléi

Wéi ech geléiert hunn Auto ze fueren, ass den Instruktor an der éischter Lektioun ëmgedréint an d'Kräizung gefuer, an huet dunn gesot, et sollt een dat net maachen - guer net. Ech erënnere mech un dës Regel direkt a fir de Rescht vu mengem Liewen.

Dir liest Kanner "Schlecht Rot" vum Grigory Oster, an Dir gesitt wéi einfach an natierlech et hinnen opfällt, datt se dat net sollten maachen.

Vill Artikele goufe geschriwwe wéi een Dockerfile korrekt schreift. Awer ech hu keng Instruktioune begéint wéi falsch Dockerfiles schreiwen. Ech fëllen dës Lück. A vläicht an de Projeten, déi ech Ënnerstëtzung kréien, ginn et manner esou Dockerfilen.

All Personnagen, Situatiounen an Dockerfile si fiktiv. Wann Dir Iech selwer erkennt, sorry.

En Dockerfile erstellen, ominös a schrecklech

Peter (Senior Java/rubby/php Entwéckler): Kolleg Vasily, hutt Dir schonn en neie Modul op Docker eropgelueden?
Vasily (Junior): Nee, ech hat keng Zäit, ech kann et net mat dësem Docker erausfannen. Et gi sou vill Artikelen doriwwer, et ass schwindeleg.

Peter: Mir haten eng Frist virun engem Joer. Loosst mech Iech hëllefen, mir wäerten et am Prozess erausfannen. Sot mir wat fir Iech net funktionnéiert.

Vasily: Ech kann net e Basisbild wielen, sou datt et minimal ass, awer alles wat Dir braucht.
Peter: Huelt d'Ubuntu Bild, et huet alles wat Dir braucht. A wat vill onnéideg ass, kommen herno an der Hand. An vergiesst net déi lescht Tag ze setzen sou datt d'Versioun ëmmer déi lescht ass.

An déi éischt Zeil erschéngt am Dockerfile:

FROM ubuntu:latest

Peter: Wat ass nächst, wat hu mir benotzt fir eise Modul ze schreiwen?
Vasily: Also Rubin, et gëtt e Webserver an e puer Service Daemone solle gestart ginn.
Peter: Jo, wat brauche mir: Rubin, Bundler, Nodejs, Imagemagick a wat soss ... A gläichzäiteg en Upgrade maachen fir definitiv nei Packagen ze kréien.
Vasily: A mir wäerte kee Benotzer erstellen fir datt mir net ënner Root sinn?
Peter: Fuck et, dann muss een nach mat de Rechter narren.
Vasily: Ech brauch Zäit, ongeféier 15 Minutten, fir dat alles an ee Kommando ze setzen, ech liesen dat ...
(Peter ënnerbrach ruppeg de virsiichteg a ganz schlau Junior.)
Peter: Schreift an getrennten Kommandoen, et wäert méi einfach sinn ze liesen.

Dockerfile wiisst:

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

Dann Igor Ivanovich, DevOps (awer méi Ops wéi Dev), platzt an de Büro a rifft:

AI: Petya, Är Entwéckler hunn d'Liewensmëtteldatenbank erëm gebrach, wéini wäert dëst Enn ...

No engem klenge Schierm killt den Igor Ivanovich of a fänkt un erauszefannen wat seng Kollegen hei maachen.

AI: Wat maacht Dir?
Vasily: De Peter hëlleft mir eng Dockerfile fir en neie Modul ze kreéieren.
AI: Loosst mech kucken ... Wat hutt Dir hei geschriwwen, Dir botzt de Repository mat engem separaten Kommando, dëst ass eng zousätzlech Schicht ... Awer wéi installéiert Dir Ofhängegkeeten wann Dir de Gemfile net kopéiert hutt! An am Allgemengen ass dëst net gutt.
Peter: Gitt w.e.g. iwwer Äert Geschäft, mir wäerten et iergendwéi erausfannen.

Den Igor Ivanovich suckt traureg a léisst erausfannen, wien d'Datebank gebrach huet.

Peter: Jo, mä hien hat Recht iwwer de Code, mir mussen en an d'Bild drécken. A loosst eis direkt ssh a Supervisor installéieren, soss fänken mir d'Dämonen un.

Vasily: Da kopéieren ech fir d'éischt de Gemfile a Gemfile.lock, dann installéieren ech alles, an dann kopéieren ech de ganze Projet. Wann de Gemfile net ännert, gëtt d'Schicht aus dem Cache geholl.
Peter: Firwat sidd Dir all mat dëse Schichten, Kopie alles op eemol. Kopie direkt. Déi éischt Linn.

Den Dockerfile gesäit elo esou aus:

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: Also, wat dann? Hutt Dir Konfiguratiounen fir Supervisor?
Vasily: Nee, nee. Mee ech maachen et séier.
Peter: Da maacht Dir et. Loosst eis elo en Init Skript skizzéieren dat alles lancéiert. Okay, also start Dir ssh, mat nohup, fir datt mir mam Container kënne verbannen a kucken wat falsch gaang ass. Da lafen Supervisor an déi selwecht Manéier. Ee, dann lafen Dir just Passagéier.
Q: Awer ech hunn gelies datt et ee Prozess sollt sinn, sou datt Docker weess datt eppes falsch gaang ass a kann de Container nei starten.
P: Maacht Äre Kapp net mat Blödsinn. An am Allgemengen, wéi? Wéi leeft Dir dat alles an engem Prozess? Loosst Igor Ivanovich iwwer Stabilitéit denken, et ass net fir näischt datt hien eng Pai kritt. Eis Aarbecht ass Code ze schreiwen. An am allgemengen, loosst hien Iech Merci soen, datt mir den Dockefile fir hien geschriwwen hunn.

10 Minutten an zwee Videoen iwwer Kazen méi spéit.

Q: Ech hunn alles gemaach. Ech hunn méi Kommentaren bäigefüügt.
P: Weis mir!

Déi lescht Versioun vum 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, gefällt mir. An d'Kommentaren sinn op Russesch, praktesch a liesbar, jidderee géif esou schaffen. Ech hunn Iech alles geléiert, de Rescht kënnt Dir selwer maachen. Loosst eis Kaffi drénken ...

Gutt, elo hu mir e perfekt schrecklechen Dockerfile, deen d'Aen Igor Ivanovich wëll ophalen a seng Ae fir eng aner Woch verletzen. D'Dockerfile, natierlech, kéint nach méi schlëmm sinn, et gëtt keng Limite fir Perfektioun. Awer fir e Start wäert dëst maachen.

Ech wëll mat engem Zitat vum Grigory Oster ofschléissen:

Wann Dir nach net sécher sidd
Mir hunn de Wee am Liewen gewielt,
An Dir wësst net firwat
Start Är Aarbechtsrees,
Break d'Glühbirnen an de Gäng -
D'Leit soen Iech "Merci".
Dir wäert de Leit hëllefen
Spuert Stroum.

Source: will.com

Setzt e Commentaire