Docker: dårlig råd

Docker: dårlig råd

Da jeg skulle lære å kjøre bil, kjørte instruktøren helt i første time inn i krysset i revers, og sa så at det skulle du ikke gjøre – aldri i det hele tatt. Jeg husket denne regelen umiddelbart og for resten av livet.

Du leser «Bad Advice» av Grigory Oster for barn, og du ser hvor lett og naturlig det går opp for dem at de ikke bør gjøre dette.

Det er skrevet mange artikler om hvordan man skriver en Dockerfile riktig. Men jeg kom ikke over instruksjoner om hvordan du skriver feil Dockerfiler. Jeg fyller dette gapet. Og kanskje i de prosjektene jeg får støtte, vil det være færre slike dockerfiler.

Alle karakterer, situasjoner og Dockerfile er fiktive. Hvis du kjenner deg igjen, beklager.

Å lage en Dockerfile, illevarslende og forferdelig

Peter (Senior java/rubby/php-utvikler): Kollega Vasily, har du allerede lastet opp en ny modul til Docker?
Vasily (junior): Nei, jeg hadde ikke tid, jeg kan ikke finne ut av det med denne Docker. Det er så mange artikler om det, det er svimlende.

Peter: Vi hadde en frist for et år siden. La meg hjelpe deg, vi finner ut av det i prosessen. Fortell meg hva som ikke fungerer for deg.

Vasily: Jeg kan ikke velge et grunnleggende bilde slik at det er minimalt, men har alt du trenger.
Peter: Ta ubuntu-bildet, det har alt du trenger. Og det som er mye unødvendig kommer godt med senere. Og ikke glem å sette den nyeste taggen slik at versjonen alltid er den nyeste.

Og den første linjen vises i Dockerfilen:

FROM ubuntu:latest

Peter: Hva er det neste, hva brukte vi til å skrive modulen vår?
Vasily: Så ruby, det er en webserver og et par tjenestedemoner bør lanseres.
Peter: Ja, hva trenger vi: rubin, bundler, nodejs, imagemagick og hva annet... Og gjør samtidig en oppgradering for definitivt å få nye pakker.
Vasily: Og vi vil ikke opprette en bruker slik at vi ikke er under root?
Peter: Faen, da må du fortsatt tulle med rettighetene.
Vasily: Jeg trenger tid, omtrent 15 minutter, til å sette det hele sammen til én kommando, jeg leste at...
(Peter avbryter frekt den grundige og veldig smarte junioren.)
Peter: Skriv i separate kommandoer, det blir 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/*

Så kommer Igor Ivanovich, DevOps (men mer Ops enn Dev), inn på kontoret og roper:

AI: Petya, utviklerne dine brøt matdatabasen igjen, når tar dette slutt...

Etter en liten trefning kjøler Igor Ivanovich seg ned og begynner å finne ut hva kollegene hans gjør her.

AI: Hva gjør du?
Vasily: Peter hjelper meg å lage en Dockerfile for en ny modul.
AI: La meg ta en titt... Hva skrev du her, du renser depotet med en egen kommando, dette er et ekstra lag... Men hvordan installerer du avhengigheter hvis du ikke har kopiert Gemfilen! Og generelt sett er dette ikke bra.
Peter: Vær så snill å gå i gang med virksomheten din, vi finner ut av det på en eller annen måte.

Igor Ivanovich sukker trist og går for å finne ut hvem som brøt databasen.

Peter: Ja, men han hadde rett om koden, vi må presse den inn i bildet. Og la oss umiddelbart installere ssh og supervisor, ellers starter vi demonene.

Vasily: Da vil jeg først kopiere Gemfile og Gemfile.lock, deretter installerer jeg alt, og så kopierer jeg hele prosjektet. Hvis Gemfilen ikke endres, vil laget bli tatt fra cachen.
Peter: Hvorfor er dere alle med disse lagene, kopier alt på en gang. Kopier med en gang. Den aller første linjen.

Dockerfilen 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 neste? Har du konfigurasjoner for supervisor?
Vasily: Nei, nei. Men jeg skal gjøre det raskt.
Peter: Da gjør du det. La oss nå skissere et init-skript som vil lansere alt. Ok, så du starter ssh, med nohup, slik at vi kan koble til containeren og se hva som gikk galt. Kjør deretter veileder på samme måte. Vel, da er det bare å kjøre passasjer.
Spørsmål: Men jeg leste at det burde være én prosess, så Docker vil vite at noe gikk galt og kan starte beholderen på nytt.
P: Ikke bry hodet med tull. Og generelt, hvordan? Hvordan kjører du alt dette i én prosess? La Igor Ivanovich tenke på stabilitet, det er ikke for ingenting at han mottar lønn. Vår jobb er å skrive kode. Og generelt, la ham si takk for at vi skrev Dockefilen for ham.

10 minutter og to videoer om katter senere.

Q: Jeg har gjort alt. Jeg la til flere kommentarer.
P: Vis meg!

Siste versjon 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: Flott, jeg liker det. Og kommentarene er på russisk, praktiske og lesbare, alle ville fungere slik. Jeg lærte deg alt, du kan gjøre resten selv. La oss ta en kaffe...

Vel, nå har vi en helt forferdelig Dockerfile, hvis syn vil få Igor Ivanovich til å ønske å slutte og øynene hans vil gjøre vondt i en uke til. Dockerfilen kan selvfølgelig være enda verre, det er ingen grense for perfeksjon. Men til å begynne med vil dette duge.

Jeg vil avslutte med et sitat fra Grigory Oster:

Hvis du ikke er sikker ennå
Vi valgte veien i livet,
Og du vet ikke hvorfor
Start arbeidsreisen din,
Knekk lyspærene i gangene -
Folk vil si "Takk" til deg.
Du vil hjelpe folket
Spar strøm.

Kilde: www.habr.com

Legg til en kommentar