Docker: skadliga rÄd

Docker: skadliga rÄd

NĂ€r jag lĂ€rde mig köra bil körde instruktören direkt ut pĂ„ korsningen bakĂ„t pĂ„ den första lektionen och sa sedan att man absolut inte fĂ„r göra sĂ„ — aldrig. Denna regel kom jag ihĂ„g direkt och för hela livet.

Du lÀser för barnen "Skadliga rÄd" av Grigory Oster, och ser hur lÀtt och obehindrat de tar till sig att man inte fÄr göra sÄ.

Det har skrivits mycket om hur man korrekt skriver en Dockerfile. Men jag har inte stött pÄ nÄgra instruktioner om hur man skriver en felaktig Dockerfile. Jag ÄtgÀrdar denna brist. Och kanske kommer det bli fÀrre sÄdana Dockerfiles i de projekt jag fÄr supporta.

Alla karaktÀrer, situationer och Dockerfiles Àr fiktiva. Om du kÀnner igen dig sjÀlv, förlÄt.

Vi skapar en Dockerfile, mörk och skrÀmmande

Petr (Senior Java/Ruby/PHP-utvecklare): Kollega Vasiliy, har du redan laddat upp den nya modulen till Docker?
Vasiliy (junior): Nej, jag har inte hunnit, jag kan verkligen inte fÄ grepp om detta Docker. Det finns sÄ mÄnga artiklar om det, jag fÄr spader.

Petr: Vi hade en deadline för ett Är sedan. LÄt mig hjÀlpa till, sÄ förstÄr vi det nÀr vi gör det. BerÀtta vad du har problem med.

Vasiliy: Jag kan inte vÀlja en grundbild som Àr minimal, men har allt som behövs.
Petr: Ta ubuntu-bilden, dÀr finns allt som behövs. Det som Àr överflödigt kan alltid anvÀndas senare. Och glöm inte att sÀtta taggen latest sÄ att versionen alltid Àr den senaste.

Och i Dockerfile dyker den första raden upp:

FROM ubuntu:latest

Petr: Vad kommer hÀrnÀst, vad skrev vi modulen pÄ?
Vasiliy: SÄ ruby, dÀr ska en webbserver och nÄgra tjÀnstediagram starta.
Petr: Aha, vad behöver vi: ruby, bundler, nodejs, imagemagick och vad mer ... Och gör en uppgradering samtidigt för att sÀkerstÀlla att du fÄr nya paket.
Vasiliy: Ska vi inte skapa en anvÀndare för att inte köra som root?
Petr: Nej, vi kommer fÄ jobba mer med rÀttigheterna senare.
Vasiliy: Jag behöver tid, cirka 15 minuter, för att fÄ ihop allt i ett kommando, jag har lÀst att...
(Petr avbryter grovt den pÄtrÀngande och överintelligent junioren.)
Petr: Skriv separata kommandon, sÄ blir det enklare att lÀsa.

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

HÀr stormar Igor Ivanovich, DevOps (men mer Ops Àn Dev), in i kontoret och skriker:

II: Petya, dina utvecklare har igen krossat produktionsdatabasen, nÀr ska det ta slut....

Efter en liten dispyt lugnar sig Igor Ivanovich och börjar ta reda pÄ vad kollegorna sysslar med.

AI: Vad Àr ni upptagna med?
Vasilij: Petr hjÀlper mig att skapa en Dockerfile för den nya modulen.
AI: LÄt mig titta... Vad har ni skrivit hÀr, ni stÀdar ju repot med ett eget kommando, det hÀr blir ju ett extra lager... Men hur installerar ni beroenden om ni inte har kopierat Gemfile! Och överhuvudtaget, det hÀr fungerar ju inte.
Petr: GÄ vÀnligen och gör era egna saker, vi löser det hÀr sjÀlva.

Igor Ivanovich suckar sorgset och gÄr för att ta reda pÄ vem som faktiskt har förstört databasen.

Petr: Ja, men han hade rÀtt om koden, vi mÄste stoppa in den i imaget. Och lÄt oss installera ssh och supervisor direkt, annars hur ska vi starta demonerna?

Vasilij: Jag kopierar först Gemfile och Gemfile.lock, installerar allt, och sedan kopierar jag hela projektet. Om Gemfile inte Àndras, kommer lagret att tas frÄn cachen.
Petr: Vad Àr det ni pratar om lagren, kopiera allt direkt. Kopiera direkt. Som första rad.

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

Petr: SÄ, vad gör vi hÀrnÀst? Har du konfigurationer för supervisor?
Vasilij: Nej, jag har inte. Men jag gör det snabbt.
Petr: Gör det senare. LÄt oss nu skissa pÄ ett init-skript som kommer att starta allt. SÄ, du startar ssh med nohup sÄ att vi kan ansluta tillContainern och se vad som gick fel. Sedan startar du supervisor pÄ samma sÀtt. Och sedan kommer du helt enkelt att starta passenger.
V: Men jag lÀste att det bör vara en process, sÄ Docker kommer att veta att nÄgot har gÄtt fel och kan omstarta containern.
P: Sluta bekymra dig om nonsens. Och hur? Hur ska du köra allt detta i en process? LÄt Igor Ivanovich tÀnka pÄ stabiliteten, han fÄr ju sin lön för det. VÄr uppgift Àr att skriva kod. Och överhuvudtaget, lÄt dem sÀga tack för att vi skrev Dockerfile Ät honom.

Tio minuter och tvÄ videos om katter senare.

V: Jag har gjort allt. Jag har Àven lagt till fler kommentarer.
P: Visa!

Den senaste versionen av Dockerfile:

FRÅN ubuntu:latest

# Kopiera kÀllkoden
COPY . /app
WORKDIR /app

# Uppdatera paketlistan
RUN apt-get update 

# Uppdatera paket
RUN apt-get upgrade

# Installera nödvÀndiga paket
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Installera bundler
RUN gem install bundler

# Installera nodejs som anvÀnds för att bygga statisk
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Installera beroenden
RUN bundle install --without development test --path vendor/bundle

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

# Kör skriptet nÀr containern startas för att starta allt annat.
CMD ["/app/init.sh"]

P: UtmÀrkt, jag gillar det. Och kommentarerna pÄ ryska, praktiska och lÀsbara, alla borde arbeta sÄ hÀr. Jag har lÀrt dig allt, nu kan du klara dig sjÀlv. LÄt oss gÄ och dricka kaffe


NÄvÀl, hÀr har vi fÄtt en perfekt förskrÀcklig Dockerfile, vars utseende fÄr Igor Ivanovich att vilja sÀga upp sig och hans ögon kommer att göra ont en vecka till. Dockerfile kunde förstÄs ha varit Ànnu vÀrre, det finns inga grÀnser för perfektion. Men för början fÄr det duga.

Jag skulle vilja avsluta med ett citat av Grigorij Oster:

Om du Ànnu inte har bestÀmt
Vilken vÀg du ska gÄ i livet,
Och inte vet var du skulle
Börja din arbetsvÀg,
SlĂ„ pĂ„ glödlamporna i trapphusen —
Folk kommer att sÀga "Tack".
Du kommer att hjÀlpa folket
Att spara elektricitet.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster