Docker: Dårlige råd

Docker: Dårlige råd

Da jeg lærte at køre bil, kørte instruktøren allerede i første lektion baglæns ud på krydset og sagde derefter, at man aldrig må gøre sådan. Den regel huskede jeg straks og for livet.

Når du læser "Skadelige råd" af Grigory Oster for børn, ser du, hvor let og ubesværet de forstår, at man ikke må gøre sådan.

Der er skrevet mange artikler om, hvordan man korrekt skriver et Dockerfile. Men jeg har ikke set instruktioner til, hvordan man skriver et forkert Dockerfile. Jeg fylder dette hul. Og måske vil der blive færre sådanne Dockerfiles i de projekter, jeg får til support.

Alle karakterer, situationer og Dockerfile er fiktive. Hvis du genkender dig selv, beklager jeg.

Lad os oprette et Dockerfile, skræmmende og frygtindgydende.

Peter (Senior java/ruby/php udvikler): Kollega Vasily, har du uploadet det nye modul til Docker?
Vasily (junior): Nej, jeg har ikke haft tid, jeg kan ikke finde ud af Docker. Der er så mange artikler om det, mine øjne bliver helt forvirrede.

Peter: Vores deadline var for et år siden. Lad mig hjælpe dig, så vi kan finde ud af det i processen. Fortæl mig, hvad du har problemer med.

Vasily: Jeg kan ikke vælge et grundlag, som er minimalt, men stadig indeholder alt, hvad jeg behøver.
Peter: Tag ubuntu-billedet, det indeholder alt, hvad der er nødvendigt. Og hvis der er for meget overflødigt, kan det komme til nytte senere. Og glem ikke at sætte tagget latest, så versionen altid er den nyeste.

Og i Dockerfile tilføjes den første linje:

FROM ubuntu:latest

Peter: Hvad er næste skridt, hvad skrev vi vores modul i?
Vasily: Det er jo ruby, der skal køre en webserver og et par hjælpe-processer.
Peter: Okay, hvad har vi brug for: ruby, bundler, nodejs, imagemagick og hvad der ellers skal til … Og samtidig, lav en opgradering for at få de nyeste pakker.
Vasily: Skal vi ikke oprette en bruger for ikke at køre under root?
Peter: Næh, lad os ikke gøre det, det vil føre til problemer med rettighederne senere.
Vasily: Jeg har brug for tid, omkring 15 minutter, til at få det hele sat sammen i et kommando, jeg læste, at …
(Peter afbryder grusomt den nysgerrige og alt for kloge junior.)
Peter: Skriv det i separate kommandoer, så bliver det lettere at læse.

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

I dette øjeblik bryder Igor Ivanovich, DevOps (men mere Ops end Dev), ind i kontoret og råber:

II: Petya, dine udviklere har igen ødelagt produktionsdatabasen, hvornår slutter det dog ...

Efter en lille skænderi køler Igor Ivanovich af og begynder at finde ud af, hvad kollegerne laver her.

AI: Hvad er I beskæftiget med?
Vasilij: Peter hjælper mig med at oprette en Dockerfile til det nye modul.
AI: Lad mig se... Hvad har I dog skrevet her, I renser jo arkivet med et separat team, det er en ekstra lag... Hvordan installerer I afhængighederne, hvis I ikke har kopieret Gemfile! Og overhovedet, det er ikke i orden.
Peter: Gå venligst og pas jeres egne anliggender, vi klarer os her.

Igor Ivanovich sukker trist og går for at finde ud af, hvem der har ødelagt databasen.

Peter: Ja, men han har ret om koden, den skal puttes ind i billedet. Lad os installere ssh og supervisor med det samme, hvordan skal vi ellers starte dæmonerne?

Vasilij: Jeg kopierer først Gemfile og Gemfile.lock, så installerer jeg alt, og derefter kopierer jeg hele projektet. Hvis Gemfile ikke ændres, tages laget fra cachen.
Peter: Hvad er det med jer og de lag, kopier det hele med det samme. Kopier det hele. Som første linje.

Dockerfile ser nu således ud:

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å, hvad nu? Har du konfigurationerne til supervisor?
Vasilij: Nej, jeg har ikke. Men jeg laver det hurtigt.
Peter: Lav det senere. Lad os skrive et init-script nu, der vil starte det hele. Så, du starter ssh med nohup, så vi kan forbinde til containeren og se, hvad der gik galt. Start så supervisor på samme måde. Og så starter du bare passenger.
V: Men jeg har læst, at der skal være én proces, så Docker kan vide, at noget er gået galt, og kan genstarte containeren.
P: Lad ikke hovedet blive fyldt med nonsens. Hvordan? Hvordan vil du starte det hele i én proces? Lad Igor Ivanovich tænke på stabiliteten, han får ikke løn for ingenting. Vores opgave er at skrive koden. Og i øvrigt, han skal være taknemmelig for, at vi har skrevet Dockerfile for ham.

Ti minutter senere og to videoer om katte.

V: Jeg er færdig. Jeg har også tilføjet flere kommentarer.
P: Lad os se!

Den friske version af Dockerfile:

FROM ubuntu:latest

# Kopierer kildekoden
COPY .\/ \/app
WORKDIR \/app

# Opdaterer pakkelisten
RUN apt-get update 

# Opdaterer pakker
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 bruges til at bygge statikken
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# Installerer afhængigheder
RUN bundle install --without development test --path vendor\/bundle

# Rydder op efter sig selv i caches
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem 
RUN apt-get clean 
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/* 

# Kører et script, når containeren starter, som starter alt andet.
CMD ["\/app\/init.sh"]

P: Fremragende, jeg kan lide det. Og kommentarerne på russisk, praktisk og læsbart, alle burde arbejde sådan. Jeg har lært dig alt, nu kan du klare dig selv. Lad os gå ud og drikke kaffe…

Sådan, vi har fået en perfekt frygtelig Dockerfile, som vil få Igor Ivanovich til at overveje at opsige sig og han vil have ondt i øjnene i en uge. Dockerfile kunne selvfølgelig have været meget værre; der er ingen grænser for perfektion. Men for nu må det være nok.

Jeg vil gerne afslutte med et citat af Grigory Oster:

Hvis du endnu ikke er helt
Klart over hvilken vej du vil vælge,
Og ikke ved, hvordan du skal gå i gang
Med din erhvervskarriere,
Slå nogle lamper i opgangene —
Folk vil sige "Tak" til dig.
Du vil hjælpe folk
Med at spare elektricitet.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster