Docker: dårligt råd

Docker: dårligt råd

Da jeg skulle lære at køre bil, kørte instruktøren i den allerførste lektion baglæns ind i krydset, og sagde så, at det skulle man ikke – overhovedet aldrig. Jeg huskede denne regel med det samme og resten af ​​mit liv.

Du læser "Bad Advice" af Grigory Oster for børn, og du ser, hvor let og naturligt det går op for dem, at de ikke skal gøre dette.

Der er skrevet en masse artikler om, hvordan man skriver en Dockerfile korrekt. Men jeg stødte ikke på instruktioner om, hvordan man skriver forkerte Dockerfiler. Jeg udfylder dette hul. Og måske i de projekter, som jeg modtager støtte, vil der være færre sådanne dockerfiler.

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

Oprettelse af en Dockerfile, ildevarslende og forfærdelig

Peter (Senior java/rubby/php-udvikler): Kollega Vasily, har du allerede uploadet et nyt modul til Docker?
Vasily (junior): Nej, jeg havde ikke tid, jeg kan ikke finde ud af det med denne Docker. Der er så mange artikler om det, det er svimlende.

Peter: Vi havde en deadline for et år siden. Lad mig hjælpe dig, vi finder ud af det i processen. Fortæl mig, hvad der ikke virker for dig.

Vasily: Jeg kan ikke vælge et grundlæggende billede, så det er minimalt, men har alt, hvad du har brug for.
Peter: Tag ubuntu-billedet, det har alt hvad du behøver. Og hvad der er en masse unødvendige ting vil komme til nytte senere. Og glem ikke at sætte det seneste tag, så versionen altid er den nyeste.

Og den første linje vises i Dockerfilen:

FROM ubuntu:latest

Peter: Hvad er det næste, hvad brugte vi til at skrive vores modul?
Vasily: Så ruby, der er en webserver, og et par service-dæmoner bør lanceres.
Peter: Ja, hvad har vi brug for: rubin, bundler, nodejs, imagemagick og hvad ellers... Og lav samtidig en opgradering for helt sikkert at få nye pakker.
Vasily: Og vi vil ikke oprette en bruger, så vi ikke er under root?
Peter: Fuck det, så skal du stadig fjolle med rettighederne.
Vasily: Jeg har brug for tid, omkring 15 minutter, til at samle det hele i én kommando, jeg læste det...
(Peter afbryder groft den omhyggelige og meget smarte junior.)
Peter: Skriv i separate kommandoer, det bliver 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/*

Så brager Igor Ivanovich, DevOps (men mere Ops end Dev), ind på kontoret og råber:

AI: Petya, dine udviklere brød fødevaredatabasen igen, hvornår vil det ende...

Efter en lille træfning køler Igor Ivanovich ned og begynder at finde ud af, hvad hans kolleger laver her.

AI: Hvad laver du?
Vasily: Peter hjælper mig med at oprette en Dockerfile til et nyt modul.
AI: Lad mig tage et kig... Hvad skrev du her, du renser depotet med en separat kommando, dette er et ekstra lag... Men hvordan installerer du afhængigheder, hvis du ikke har kopieret Gemfilen! Og generelt er dette ikke godt.
Peter: Gå venligst om din virksomhed, vi finder ud af det på en eller anden måde.

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

Peter: Ja, men han havde ret i koden, vi skal skubbe den ind i billedet. Og lad os straks installere ssh og supervisor, ellers starter vi dæmonerne.

Vasily: Så kopierer jeg først Gemfile og Gemfile.lock, derefter installerer jeg alt, og så kopierer jeg hele projektet. Hvis Gem-filen ikke ændres, vil laget blive taget fra cachen.
Peter: Hvorfor har I alle disse lag, kopier alt på én gang. Kopier med det samme. Den allerførste linje.

Dockerfilen ser nu sådan 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 så? Har du konfigurationer til supervisor?
Vasily: Nej, nej. Men jeg gør det hurtigt.
Peter: Så gør du det. Lad os nu skitsere et init-script, der vil starte alt. Okay, så du starter ssh med nohup, så vi kan oprette forbindelse til containeren og se, hvad der gik galt. Kør derefter supervisor på samme måde. Nå, så kører du bare passager.
Q: Men jeg læste, at der skulle være én proces, så Docker vil vide, at noget gik galt og kan genstarte containeren.
P: Lad være med at genere dit hoved med nonsens. Og generelt, hvordan? Hvordan kører du alt dette i én proces? Lad Igor Ivanovich tænke på stabilitet, det er ikke for ingenting, at han modtager en løn. Vores opgave er at skrive kode. Og generelt, lad ham sige tak for, at vi skrev Dockefilen til ham.

10 minutter og to videoer om katte senere.

Q: Jeg har gjort alt. Jeg tilføjede flere kommentarer.
P: Vis mig!

Seneste version af 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: Godt, jeg kan lide det. Og kommentarerne er på russisk, praktiske og læsbare, alle ville arbejde sådan. Jeg lærte dig alt, resten kan du selv klare. Lad os tage en kop kaffe...

Nå, nu har vi en helt forfærdelig Dockerfile, hvis syn vil få Igor Ivanovich til at ønske at holde op, og hans øjne vil gøre ondt i endnu en uge. Dockerfilen kunne selvfølgelig være endnu værre, der er ingen grænse for perfektion. Men til at begynde med vil det her duer.

Jeg vil gerne slutte med et citat fra Grigory Oster:

Hvis du ikke er sikker endnu
Vi valgte vejen i livet,
Og du ved ikke hvorfor
Start din arbejdsrejse,
Knæk pærerne i gangene -
Folk vil sige "tak" til dig.
Du vil hjælpe folket
Spar strøm.

Kilde: www.habr.com

Tilføj en kommentar