Docker: dåligt råd

Docker: dåligt råd

När jag skulle lära mig att köra bil körde instruktören redan vid första lektionen in i korsningen baklänges och sa sedan att det ska man inte göra - aldrig alls. Jag kom ihåg denna regel omedelbart och för resten av mitt liv.

Du läser "Bad Advice" av Grigory Oster för barn, och du ser hur lätt och naturligt det går upp för dem att de inte ska göra detta.

Många artiklar har skrivits om hur man skriver en Dockerfil på rätt sätt. Men jag stötte inte på instruktioner om hur man skriver felaktiga Dockerfiler. Jag fyller denna lucka. Och kanske i de projekt som jag får stöd blir det färre sådana dockerfiler.

Alla karaktärer, situationer och Dockerfile är fiktiva. Om du känner igen dig, förlåt.

Skapa en Dockerfil, olycksbådande och fruktansvärt

Peter (Senior java/rubby/php-utvecklare): Kollega Vasily, har du redan laddat upp en ny modul till Docker?
Vasily (junior): Nej, jag hade inte tid, jag kan inte komma på det med den här Docker. Det finns så många artiklar om det, det är svindlande.

Peter: Vi hade en deadline för ett år sedan. Låt mig hjälpa dig, vi tar reda på det i processen. Berätta för mig vad som inte fungerar för dig.

Vasily: Jag kan inte välja en grundläggande bild så att den är minimal, men har allt du behöver.
Peter: Ta ubuntu-bilden, den har allt du behöver. Och det som är en massa onödiga saker kommer väl till pass senare. Och glöm inte att sätta den senaste taggen så att versionen alltid är den senaste.

Och den första raden visas i Dockerfilen:

FROM ubuntu:latest

Peter: Vad händer härnäst, vad använde vi för att skriva vår modul?
Vasily: Så ruby, det finns en webbserver och ett par tjänstdemoner bör lanseras.
Peter: Ja, vad behöver vi: ruby, bundler, nodejs, imagemagick och vad mer... Och gör samtidigt en uppgradering för att definitivt få nya paket.
Vasily: Och vi kommer inte att skapa en användare så att vi inte kommer att vara under root?
Peter: Fy fan, då måste du ändå busa med rättigheterna.
Vasily: Jag behöver tid, ungefär 15 minuter, för att få ihop allt till ett kommando, jag läste att...
(Peter avbryter ohövligt den noggranna och mycket smarta junioren.)
Peter: Skriv i separata kommandon, det blir lättare att läsa.

Dockerfile växer:

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

Sedan kommer Igor Ivanovich, DevOps (men mer Ops än Dev), in på kontoret och ropar:

AI: Petya, dina utvecklare bröt matdatabasen igen, när ska detta sluta...

Efter en liten skärmytsling svalnar Igor Ivanovich och börjar ta reda på vad hans kollegor gör här.

AI: Vad gör du?
Vasily: Peter hjälper mig att skapa en Dockerfile för en ny modul.
AI: Låt mig ta en titt... Vad skrev du här, du rensar förvaret med ett separat kommando, detta är ett extra lager... Men hur installerar du beroenden om du inte har kopierat Gemfilen! Och i allmänhet är detta inte bra.
Peter: Snälla gå vidare med ditt företag, vi kommer att reda ut det på något sätt.

Igor Ivanovich suckar sorgset och går för att ta reda på vem som har brutit databasen.

Peter: Ja, men han hade rätt om koden, vi måste trycka in den i bilden. Och låt oss omedelbart installera ssh och supervisor, annars startar vi demonerna.

Vasily: Då kopierar jag först Gemfile och Gemfile.lock, sedan installerar jag allt och sedan kopierar jag hela projektet. Om Gemfilen inte ändras, kommer lagret att tas från cachen.
Peter: Varför har ni alla dessa lager, kopiera allt på en gång. Kopiera direkt. Den allra första raden.

Dockerfilen ser nu ut så här:

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: Så, vad händer härnäst? Har du inställningar för supervisor?
Vasily: Nej, nej. Men jag ska göra det snabbt.
Peter: Då gör du det. Låt oss nu skissa på ett init-skript som kommer att lansera allt. Okej, så du startar ssh, med nohup, så att vi kan ansluta till behållaren och se vad som gick fel. Kör sedan handledare på samma sätt. Nåväl, då kör du bara passagerare.
F: Men jag läste att det borde finnas en process, så Docker vet att något gick fel och kan starta om behållaren.
P: Stör inte ditt huvud med nonsens. Och i allmänhet, hur? Hur kör du allt detta i en process? Låt Igor Ivanovich tänka på stabilitet, det är inte för inte som han får en lön. Vårt jobb är att skriva kod. Och i allmänhet, låt honom säga tack för att vi skrev Dockefilen för honom.

10 minuter och två filmer om katter senare.

F: Jag har gjort allt. Jag har lagt till fler kommentarer.
P: Visa mig!

Senaste versionen av 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: Bra, jag gillar det. Och kommentarerna är på ryska, bekväma och läsbara, alla skulle fungera så. Jag lärde dig allt, resten kan du göra själv. Låt oss ta lite kaffe...

Nåväl, nu har vi en helt fruktansvärd Dockerfile, vars syn kommer att få Igor Ivanovich att vilja sluta och hans ögon kommer att göra ont i ytterligare en vecka. Dockerfilen kan naturligtvis vara ännu värre, det finns ingen gräns för perfektion. Men till att börja med kommer detta att duga.

Jag skulle vilja avsluta med ett citat från Grigory Oster:

Om du inte är säker än
Vi valde vägen i livet,
Och du vet inte varför
Börja din arbetsresa,
Slå sönder glödlamporna i korridorerna -
Folk kommer att säga "Tack" till dig.
Du kommer att hjälpa folket
Spara elektricitet.

Källa: will.com

Lägg en kommentar