Docker: Skadelige rÄd

Docker: Skadelige rÄd

Da eg lÊrte Ä kjÞre bil, kjÞrte instruktÞren bakover ut i et kryss allerede pÄ fÞrste time, og sa deretter at man aldri skal gjÞre det. Den regelen husket jeg med en gang og for livet.

NÄr du leser «Skadelige rÄd» av Grigori Oster for barna, ser du hvor lett og uanstrengt de forstÄr at det ikke er riktig Ä gjÞre det.

Det er skrevet mange artikler om hvordan du skriver en Dockerfile riktig. Men jeg har ikke funnet instruksjoner for hvordan man skriver en feil Dockerfile. Jeg skal fylle dette hullet. Og kanskje blir det fÊrre slike Dockerfiles i prosjektene jeg fÄr ansvar for.

Alle helter, situasjoner og Dockerfile-er er oppdiktet. Hvis du gjenkjenner deg selv, beklager.

La oss lage en Dockerfile, skremmende og forferdelig

Petr (Senior java/ruby/php utvikler): Kollega Vasiliy, har du allerede lastet opp den nye modulen til Docker?
Vasiliy (junior): Nei, jeg har ikke rukket det, jeg klarer ikke Ä forstÄ denne Docker. SÄ mange artikler, Þynene mine gÄr i surr.

Petr: Vi hadde fristen for et Är siden. Kom igjen, jeg hjelper deg, sÄ finner vi ut av det underveis. Fortell meg hva som ikke fungerer.

Vasiliy: Jeg kan ikke velge et basebilde, som er minimalt, men har alt som trengs.
Petr: Ta ubuntu-bildet, det inneholder alt du trenger. Og det som er ekstra, kan vÊre nyttig senere. Ikke glem Ä sette taggen latest, sÄ versjonen alltid er den nyeste.

Og i Dockerfile kommer den fĂžrste linjen:

FROM ubuntu:latest

Petr: Hva er neste, hva skrev vi modulen vÄr pÄ?
Vasiliy: Det er jo ruby, der mÄ en webserver og et par hjelpeprosesser starte.
Petr: Aha, det vi trenger: ruby, bundler, nodejs, imagemagick og hva mer 
 Og samtidig, gjÞr en oppgradering for Ä fÄ de nyeste pakkene.
Vasiliy: Skal vi ikke opprette en bruker, sÄ vi ikke jobber som root?
Petr: La det vĂŠre, vi kan ta det senere med rettighetene.
Vasiliy: Jeg trenger tid, omtrent 15 minutter, for Ä fÄ alt dette inn i én kommando; jeg har lest at

(Petr avbryter den nysgjerrige og altfor smarte junioren pÄ en grov mÄte.)
Petr: Skriv det som separate kommandoer, sÄ blir det lettere Ä lese.

Dockerfile vokser:

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

Her stormer Igor Ivanovich, DevOps (men mer Ops enn Dev), inn pÄ kontoret og skriker:

II: Petya, utviklerne dine har igjen Þdelagt produksjonsdatabasen, nÄr vil dette ta slutt
.

Etter en liten krangel roer Igor Ivanovich seg ned og begynner Ă„ finne ut hva kollegene driver med.

AI: Hva er dere opptatt med?
Vasiliy: Peter hjelper meg med Ă„ lage en Dockerfile for den nye modulen.
AI: La meg se
 Hva har dere skrevet her, dere renser jo repositoriet med en egen kommando, dette er jo et ekstra lag
 Men hvordan installerer dere avhengigheter hvis dere ikke har kopiert Gemfile! Og dette fungerer overhodet ikke.
Peter: Vennligst gÄ tilbake til deres egne saker, vi klarer oss her.

Igor Ivanovich sukker trist og gÄr for Ä finne ut hvem som har Þdelagt databasen.

Peter: Ja, men han sa riktig om koden, den mÄ vÊre med i bildet. La oss ogsÄ sette opp ssh og supervisor med en gang, for hvordan skal vi starte demonene?

Vasiliy: Jeg kopierer fÞrst Gemfile og Gemfile.lock, sÄ installerer jeg alt, og til slutt kopierer jeg hele prosjektet. Hvis Gemfile ikke endres, vil laget bli hentet fra cachen.
Peter: Hva er det med disse lagene, kopier alt med en gang. Kopier alt med det fĂžrste.

Dockerfile ser nÄ slik ut:

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Ă„, hva skjer videre. Har du konfigurasjoner for supervisor?
Vasiliy: Nei, det har jeg ikke. Men jeg ordner det raskt.
Peter: Vi fÄr gjÞre det senere. La oss nÄ skissere et init-skript som vil starte alt. SÄ, du starter ssh, med nohup, slik at vi kan koble oss til containeren og se hva som gikk galt. Deretter starter du supervisor pÄ samme mÄte. Til slutt skal du bare starte passenger.
V: Men jeg har lest at det bÞr vÊre en prosess, slik at Docker kan vite at noe har gÄtt galt, og kan restarte containeren.
P: Ikke tenk pÄ tull. Og hvordan? Hvordan skal du starte alt dette i én prosess? La Igor Ivanovich tenke pÄ stabilitet, han fÄr ikke lÞnn for ingenting. VÄr oppgave er Ä skrive kode. Og for Þvrig, han bÞr vÊre takknemlig for at vi skrev Dockerfile for ham.

Ti minutter senere og to videoer med katter.

V: Jeg er ferdig. Jeg har lagt til flere kommentarer.
P: Vis meg!

Nyeste versjon av Dockerfile:

FROM ubuntu:latest

# Kopierer kildekoden
COPY . /app
WORKDIR /app

# Oppdaterer paketlisten
RUN apt-get update 

# Oppdaterer pakkene
RUN apt-get upgrade

# Installerer nĂždvendige pakker
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# Installerer bundler
RUN gem install bundler

# Installerer nodejs som brukes for Ă„ bygge statikk
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Installerer avhengigheter
RUN bundle install --without development test --path vendor/bundle

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

# KjĂžrer skriptet ved oppstart av containeren som vil starte alt annet.
CMD ["/app/init.sh"]

P: Flott, jeg liker det. Og kommentarene pÄ russisk, praktisk og lettlest, alle burde jobbe sÄnn. Jeg har lÊrt deg alt, nÄ kan du klare deg selv. La oss gÄ ta en kaffe


Vel, vi har fÄtt en perfekt fryktelig Dockerfile, som fÄr Igor Ivanovitsj til Ä ville si opp, og Þynene hans vil vÊre sÄr i en uke til. Dockerfile kunne selvfÞlgelig vÊrt enda verre, det finnes ingen grenser for perfeksjon. Men for nÄ fÄr det vÊre nok.

Jeg vil gjerne avslutte med et sitat fra Grigori Oster:

Hvis du ennÄ ikke har bestemt deg
Hvilken vei i livet du vil ta,
Og ikke vet hvor du skal begynne
Din yrkesvei,
Knus pérer i oppgangen —
Folk vil si "Takk".
Du vil hjelpe folk
Å spare strþm.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster