Docker: net schlecht Rotschléi

An de Kommentaren zu mengem Artikel Docker: schlecht Rotschléi et goufe vill Ufroe fir z'erklären firwat d'Dockerfile, déi dra beschriwwe gëtt, sou schrecklech war.

Resumé vun der viregter Episod: Zwee Entwéckler komponéieren en Dockerfile ënner enger knapper Frist. Am Prozess kënnt Ops Igor Ivanovich hinnen. Déi resultéierend Dockerfile ass sou schlecht datt d'AI op der Grenz vun engem Häerzinfarkt ass.

Docker: net schlecht Rotschléi

Loosst eis erausfannen wat mat dëser Dockerfile falsch ass.

Also ass eng Woch vergaangen.

Dev Petya trëfft Ops Igor Ivanovich am Iesszëmmer iwwer eng Taass Kaffi.

P: Igor Ivanovich, sidd Dir ganz beschäftegt? Ech géif gären erausfannen, wou mir geschrauft hunn.

AI: Dat ass gutt, Dir trefft net dacks Entwéckler déi un Ausbeutung interesséiert sinn.
Als éischt, loosst eis iwwer e puer Saachen averstanen:

  1. Docker Ideologie: ee Container - ee Prozess.
  2. Wat de Container méi kleng ass, wat besser.
  3. Wat Dir méi aus dem Cache hëlt, wat besser.

P: Firwat soll et ee Prozess an engem Container sinn?

AI: Docker, wann Dir e Container start, iwwerwaacht den Zoustand vum Prozess mat pid 1. Wann de Prozess stierft, probéiert den Docker de Container nei ze starten. Loosst eis soen datt Dir e puer Applikatiounen an engem Container lafen, oder d'Haaptapplikatioun leeft net mat pid 1. Wann de Prozess stierft, wäert Docker net doriwwer wëssen.

Wann Dir keng weider Froen hutt, weist eis w.e.g. Är Dockerfile.

An Petya huet gewisen:

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/* 
RUN rake assets:precompile
# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD ["/app/init.sh"]

AI: Oh, loosst eis et an Uerdnung huelen. Loosst eis mat der éischter Linn ufänken:

FROM ubuntu:latest

Dir huelt den Tag latest. Benotzt e Tag latest féiert zu onberechenbaren Konsequenzen. Stellt Iech vir, de Bildhalter baut eng nei Versioun vum Bild mat enger anerer Lëscht vu Software, dëst Bild kritt de leschten Tag. An Äre Container, am beschten, hält op ze bauen, an am schlëmmste Fall fangt Dir Bugs déi virdru net existéiert hunn.

Dir maacht e Bild mat engem vollwäertege OS mat vill onnéideg Software, déi de Volume vum Container opbléist. A wat méi Software, wat méi Lächer a Schwachstelle.

Ausserdeem, wat d'Bild méi grouss ass, dest méi Plaz hëlt et um Host an am Registry (späichert Dir Biller iergendwou)?

P: Jo, natierlech, mir hunn e Registry, Dir hutt et ageriicht.

AI: Also, vu wat schwätzen ech?.. Oh jo, d'Bänn... D'Laascht um Netz wiisst och. Fir en eenzegt Bild ass dëst net bemierkbar, awer wann et e kontinuéierleche Bau, Tester an Deployment ass, ass et bemierkbar. A wann Dir net Gottes Modus op AWS hutt, kritt Dir och eng kosmesch Rechnung.

Dofir musst Dir dat gëeegentste Bild wielen, mat der exakter Versioun a Minimum Software. Zum Beispill, huelt: FROM ruby:2.5.5-stretch

P: Oh, ech gesinn. Wéi a wou kann ech déi verfügbar Biller gesinn? Wéi weess ech wéi eng ech brauch?

AI: Normalerweis gi Biller aus dockerhub, verwiesselt net mat Pornhub :). Et gi meeschtens verschidde Versammlungen fir e Bild:
Alpine: Biller ginn op engem minimalistesche Linux Bild gesammelt, nëmmen 5 MB. Säin Nodeel: et ass mat senger eegener libc Implementatioun kompiléiert, Standard Packagen funktionnéieren net dran. Den erfuerderleche Package ze fannen an z'installéieren wäert vill Zäit huelen.
Scratch: Basisbild, net benotzt fir aner Biller ze bauen. Et ass eleng geduecht fir binär, preparéiert Donnéeën ze lafen. Ideal fir binär Uwendungen ze lafen déi alles enthalen wat Dir braucht, wéi GO Uwendungen.
Baséiert op all OS, wéi Ubuntu oder Debian. Gutt, ech denken net datt et néideg ass ze erklären.

AI: Elo musse mir all Extras installéieren. Packagen a läscht Är Cache. An Dir kënnt et direkt ewech geheien apt-get upgrade. Soss, mat all Build, trotz dem fixen Tag vum Basisbild, gi verschidde Biller kritt. D'Aktualiséierung vun Packagen am Bild ass d'Aufgab vum Instandhalter a gëtt begleet vum Änneren vum Tag.

P: Jo, ech hu probéiert et ze maachen, et ass esou erausgaang:

WORKDIR /app
COPY ./ /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

AI: Net schlecht, awer et gëtt och eppes ze schaffen. Kuckt, hei ass dëse Kommando:

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*  

... läscht keng Donnéeën aus dem endgültege Bild, mee kreéiert nëmmen eng zousätzlech Layer ouni dës Donnéeën. Richteg esou:

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

Mä dat ass net alles. Wat hutt Dir do, Ruby? Da musst Dir net de ganze Projet am Ufank kopéieren. Et ass genuch Gemfile a Gemfile.lock ze kopéieren.

Mat dëser Approche gëtt Bündelinstallatioun net fir all Quellännerung ausgefouert, awer nëmmen wann de Gemfile oder Gemfile.lock geännert huet.

Déiselwecht Methode funktionnéieren fir aner Sprooche mat engem Ofhängegkeetsmanager, wéi npm, pip, Komponist an anerer baséiert op engem Fichier mat enger Lëscht vun Ofhängegkeeten.

A schliisslech, erënnert Iech un datt ech am Ufank iwwer d'Docker Ideologie geschwat hunn "een Container - ee Prozess"? Dëst bedeit datt e Supervisor net néideg ass. Dir sollt och net systemd installéieren, aus de selwechte Grënn. Wesentlech ass Docker selwer e Supervisor. A wann Dir probéiert verschidde Prozesser dran ze lafen, ass et wéi verschidde Uwendungen an engem Supervisorprozess ze lafen.
Wann Dir baut, maacht Dir en eenzegt Bild, a lancéiert dann déi erfuerderlech Unzuel vu Container, sou datt ee Prozess an all leeft.

Awer méi doriwwer méi spéit.

P: Ech mengen ech verstinn. Kuckt wat geschitt:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

Kënne mir de Start vun Daemonen iwwerschreiden wann Dir de Container start?

AI: Jo, dat ass richteg. Iwwregens, Dir kënnt souwuel CMD an ENTRYPOINT benotzen. A erauszefannen wat den Ënnerscheed ass Är Hausaufgaben. Et gëtt eng gutt zu dësem Thema op Habré en Artikel.

Also, loosst eis weidergoen. Dir download eng Datei fir Node z'installéieren, awer et gëtt keng Garantie datt et enthält wat Dir braucht. Mir mussen Validatioun derbäi. Zum Beispill, wéi dëst:

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

Mat dem Checksum kënnt Dir verifizéieren datt Dir déi richteg Datei erofgelueden hutt.

P: Awer wann d'Datei ännert, fällt de Bau aus.

AI: Jo, an komesch genuch ass dëst och e Plus. Dir wäert wëssen, datt de Fichier geännert huet, an Dir wäert fäheg sinn ze gesinn, wat do geännert gouf. Dir wësst ni, si hunn bäigefüügt, soen, e Skript deen alles läscht wat et erreeche kann, oder eng Hannerdier erstellt.

P: Merci. Et stellt sech eraus datt déi lescht Dockerfile esou ausgesäit:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundle”, “exec”, “passenger”, “start"]

P: Igor Ivanovich, Merci fir Är Hëllef. Et ass Zäit fir mech ze lafen, ech muss haut nach 10 Engagementer maachen.

Igor Ivanovich, stoppt säi séiere Kolleg mat sengem Bléck, hëlt e Schlupp vu staarke Kaffi. Nodeems hien e puer Sekonnen iwwer den 99.9% SLA an de Bugsfräie Code geduecht huet, stellt hien eng Fro.

AI: Wou späichert Dir d'Logbicher?

P: Natierlech, am production.log. Iwwregens, jo, awer wéi kënne mir hinnen Zougang ouni ssh?

AI: Wann Dir se an de Fichier léisst, ass eng Léisung scho fir Iech erfonnt ginn. Den docker exec Kommando erlaabt Iech all Kommando an engem Container auszeféieren. Zum Beispill kënnt Dir Kaz fir Logbicher maachen. A benotzt de Schlëssel -et a Lafen Bash (wann am Container installéiert) gëtt Iech interaktiv Zougang zu de Container.

Awer Dir sollt keng Logbicher an Dateien späicheren. Op e Minimum féiert dat zu onkontrolléierte Wuesstum vum Container, a kee rotéiert d'Logbicher. All Logbicher sollen op stdout geschéckt ginn. Do kënne se scho mam Kommando gekuckt ginn docker Logbicher.

P: Igor Ivanovich, vläicht kann ech d'Logbicher an engem montéierte Verzeechnes setzen, op e kierperleche Node, als Benotzerdaten?

AI: Et ass gutt datt Dir net vergiess hutt d'Donnéeën ze läschen, déi op den Disk vum Node gelueden sinn. Dir kënnt dat och mat Logbicher maachen, vergiesst just net d'Rotatioun opzestellen.
Dat ass et, Dir kënnt lafen.

P: Igor Ivanovich, kënnt Dir mir roden wat ze liesen?

AI: Éischt, liesen Empfehlungen vun Docker Entwéckler, kaum jiddereen kennt Docker besser wéi si.

A wann Dir wëllt e Stage kréien, gitt op intensiv. No allem ass d'Theorie ouni Praxis dout.

Source: will.com

Setzt e Commentaire