
Toen ik leerde autorijden, reed de instructeur tijdens de eerste les achteruit een kruispunt op en zei daarna dat je dat nooit zo moest doen. Deze regel heb ik meteen en voor altijd onthouden.
Je leest de kinderen 'Slechte Adviezen' van Grigori Oster en ziet hoe gemakkelijk en vanzelfsprekend ze begrijpen dat je dat niet zo moet doen.
Er zijn talloze artikelen geschreven over hoe je een Dockerfile correct moet schrijven. Maar ik heb geen instructies gevonden over hoe je een verkeerde Dockerfile schrijft. Ik vul deze leemte op. En misschien, in de projecten die ik ondersteun, zullen er minder van zulke Dockerfiles komen.
Alle helden, situaties en Dockerfiles zijn fictief. Als je jezelf herkent, sorry.
Laten we een Dockerfile maken, sinister en angstaanjagend.
Petr (Senior java/ruby/php developer): Collega Vasily, heb je de nieuwe module al in Docker geüpload?
Vasily (junior): Nee, ik heb geen tijd gehad, ik begrijp dit Docker gewoon niet. Er zijn zoveel artikelen over, mijn ogen draaien er van.
Petr: Onze deadline was een jaar geleden. Laten we helpen, dan komen we er tijdens het proces wel uit. Vertel me wat er niet lukt.
Vasily: Ik kan geen basisafbeelding kiezen, die minimaal is maar toch alles heeft wat ik nodig heb.
Petr: Neem de ubuntu afbeelding, daarin zit alles wat je nodig hebt. Wat overbodig is, komt later ook nog van pas. En vergeet niet om de tag latest te zetten, zodat je altijd de nieuwste versie hebt.
En de eerste regel in de Dockerfile komt tot stand:
FROM ubuntu:latestPetr: Wat is er verder, waarmee hebben we onze module geschreven?
Vasily: Het is ruby, er moeten een webserver en een paar achtergrondprocessen draaien.
Petr: Aha, wat we nodig hebben: ruby, bundler, nodejs, imagemagick en wat nog meer... En maak ook een upgrade, zodat je zeker de nieuwste pakketten krijgt.
Vasily: Laten we geen gebruiker aanmaken, zodat we niet als root werken?
Petr: Ach, dat doen we later wel met de rechten.
Vasily: Ik heb tijd nodig, ongeveer 15 minuten, om dit alles in ƩƩn opdracht te verwerken, ik heb gelezen dat...
(Petr onderbreekt de pedante en slimme junior ruw.)
Petr: Schrijf het in aparte commando's, zo is het ook makkelijker te lezen.
De Dockerfile groeit:
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/*Hier komt Igor Ivanovich, DevOps (maar meer Ops dan Dev), het kantoor binnen met geschreeuw:
II: Petja, jouw ontwikkelaars hebben de productie-database weer vernield, wanneer eindigt dit...
Na een kleine woordenwisseling koelt Igor Ivanovich af en begint hij uit te zoeken waar zijn collega's mee bezig zijn.
AI: Waar zijn jullie mee bezig?
Vasili: Peter helpt me een Dockerfile samen te stellen voor de nieuwe module.
AI: Laat eens kijken... Wat hebben jullie hier geschreven, jullie ruimen de repository toch met een aparte command? Dit is een extra laag... Maar hoe installeer je afhankelijkheden als je de Gemfile niet hebt gekopieerd! En dit is helemaal niet goed.
Peter: Ga alsjeblieft met je eigen zaken bezig, wij komen hier wel uit.
Igor Ivanovich zucht treurig en gaat uitzoeken wie de database heeft kapotgemaakt.
Peter: Ja, maar hij heeft gelijk over de code, we moeten die in de image zetten. Laten we meteen ssh en supervisor installeren, anders hoe gaan we de demonprocessen opstarten?
Vasili: Ik ga eerst de Gemfile en Gemfile.lock kopiƫren, dan installeer ik alles, en daarna kopieer ik het hele project. Als de Gemfile niet verandert, wordt de laag uit de cache gehaald.
Peter: Wat heb jij met die lagen, kopieer gewoon alles meteen. Kopieer het meteen. In de eerste regel.
De Dockerfile ziet er nu als volgt uit:
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: Dus, wat nu verder. Heb je configuraties voor supervisor?
Vasili: Nee, ik heb er geen. Maar ik maak het snel.
Peter: Eerst maar later. Laten we nu een init-script maken dat alles opstart. Dus, je start ssh op met nohup, zodat we verbinding kunnen maken met de container en kunnen zien wat er niet goed ging. Start daarna ook supervisor op. En dan start je gewoon passenger.
V: Maar ik heb gelezen dat er ƩƩn proces moet zijn, zodat Docker weet dat er iets mis is en de container kan herstarten.
P: Maak je daar niet druk om. En hoe? Hoe ga jij alles in ƩƩn proces opstarten? Laat Igor Ivanovich zich zorgen maken over stabiliteit, hij krijgt zijn salaris niet voor niets. Onze taak is het om code te schrijven. En hij kan ons dankbaar zijn dat we de Dockerfile voor hem hebben geschreven.
Na 10 minuten en twee video's over kittens.
V: Ik heb alles gedaan. Ook wat opmerkingen toegevoegd.
P: Laat zien!
De nieuwste versie van Dockerfile:
FROM ubuntu:latest
# Kopieer de broncode
COPY .\/ \/app
WORKDIR \/app
# Werk de lijst met pakketten bij
RUN apt-get update
# Werk de pakketten bij
RUN apt-get upgrade
# Installeer de benodigde pakketten
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor
# Installeer bundler
RUN gem install bundler
# Installeer nodejs dat gebruikt wordt voor het bouwen van statische bestanden
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
# Installeer afhankelijkheden
RUN bundle install --without development test --path vendor\/bundle
# Maak de caches schoon
RUN rm -rf \/usr\/local\/bundle\/cache/*.gem
RUN apt-get clean
RUN rm -rf \/var\/lib\/apt\/lists/* \/tmp/* \/var\/tmp/*
# Voer het script uit bij het starten van de container, dat alles zal opstarten.
CMD ["\/app\/init.sh"]P: Geweldig, ik vind het leuk. En de opmerkingen zijn in het Russisch, handig en leesbaar, iedereen zou zo moeten werken. Ik heb je alles geleerd, vanaf nu kun je het zelf. Laten we koffie gaan drinkenā¦
Nou, we hebben een perfect verschrikkelijke Dockerfile gekregen, waarvan Igor Ivanovich wil ontslag nemen en zijn ogen nog een week pijn zullen doen. De Dockerfile kon natuurlijk nog erger zijn, er is geen limiet aan perfectie. Maar voor nu is het zo ook goed.
Ik wil eindigen met een citaat van Grigory Oster:
Als je nog niet zeker
Je pad in het leven hebt gekozen,
En niet weet waar te beginnen
Met je arbeidsweg,
Sla lampen in de trappenhuizen ā
De mensen zullen je "Dank je" zeggen.
Je helpt het volk
Om elektriciteit te besparen.
Bron: habr.com
