Docker: slecht advies

Docker: slecht advies

Toen ik leerde autorijden, reed de instructeur bij de allereerste les achteruit het kruispunt op en zei toen dat je dat niet moest doen - helemaal nooit. Ik herinnerde me deze regel onmiddellijk en voor de rest van mijn leven.

Je leest ‘Bad Advice’ van Grigory Oster voor aan kinderen, en je ziet hoe gemakkelijk en natuurlijk het tot hen doordringt dat ze dit niet zouden moeten doen.

Er zijn veel artikelen geschreven over het correct schrijven van een Dockerfile. Maar ik ben geen instructies tegengekomen over het schrijven van onjuiste Dockerfiles. Ik vul dit gat. En misschien zullen er in de projecten die ik steun krijg, minder van dergelijke dockerfiles zijn.

Alle personages, situaties en Dockerfile zijn fictief. Als je jezelf herkent, sorry.

Een Dockerfile maken, onheilspellend en verschrikkelijk

Peter (Senior java/rubby/php developer): Collega Vasily, heb je al een nieuwe module naar Docker geüpload?
Vasily (junior): Nee, ik had geen tijd, ik kom er niet uit met deze Docker. Er zijn zoveel artikelen over, het is duizelingwekkend.

Peter: Een jaar geleden hadden we een deadline. Laat mij je helpen, we komen er gaandeweg wel uit. Vertel me wat niet voor jou werkt.

Vasily: Ik kan geen basisbeeld kiezen dat minimaal is, maar wel alles heeft wat je nodig hebt.
Peter: Neem de ubuntu-image, deze heeft alles wat je nodig hebt. En wat een hoop onnodige dingen zijn, zullen later van pas komen. En vergeet niet de nieuwste tag te plaatsen, zodat de versie altijd de nieuwste is.

En de eerste regel verschijnt in de Dockerfile:

FROM ubuntu:latest

Peter: Wat nu, wat hebben we gebruikt om onze module te schrijven?
Vasily: Dus Ruby, er is een webserver en er zouden een paar servicedaemons moeten worden gelanceerd.
Peter: Ja, wat hebben we nodig: ruby, Bundler, nodejs, imagemagick en wat nog meer... En voer tegelijkertijd een upgrade uit om zeker nieuwe pakketten te krijgen.
Vasily: En we zullen geen gebruiker aanmaken zodat we niet onder de root zitten?
Peter: Fuck it, dan moet je nog met de rechten rommelen.
Vasily: Ik heb tijd nodig, ongeveer 15 minuten, om alles in één commando samen te brengen, dat heb ik gelezen...
(Peter onderbreekt de nauwgezette en zeer slimme junior grof.)
Peter: Schrijf aparte commando's, het zal gemakkelijker te lezen zijn.

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

Dan stormt Igor Ivanovich, DevOps (maar meer Ops dan Dev), het kantoor binnen en roept:

AI: Petya, jouw ontwikkelaars hebben de voedseldatabase opnieuw kapot gemaakt, wanneer zal dit eindigen...

Na een kleine schermutseling koelt Igor Ivanovich af en begint te ontdekken wat zijn collega's hier doen.

AI: Wat ben je aan het doen?
Vasily: Peter helpt me bij het maken van een Dockerfile voor een nieuwe module.
AI: Laat me eens kijken... Wat heb je hier geschreven, je maakt de repository schoon met een apart commando, dit is een extra laag... Maar hoe installeer je afhankelijkheden als je de Gemfile niet hebt gekopieerd! En over het algemeen is dit niet goed.
Peter: Ga alsjeblieft door met je zaken, we komen er wel wel uit.

Igor Ivanovitsj zucht bedroefd en vertrekt om erachter te komen wie de database heeft gebroken.

Peter: Ja, maar hij had gelijk wat betreft de code, we moeten deze in de afbeelding plaatsen. En laten we meteen ssh en supervisor installeren, anders starten we de daemons.

Vasily: Dan kopieer ik eerst Gemfile en Gemfile.lock, daarna installeer ik alles, en dan kopieer ik het hele project. Als het Gemfile niet verandert, wordt de laag uit de cache gehaald.
Peter: Waarom zitten jullie allemaal met deze lagen, kopieer alles in één keer. Kopieer meteen. De allereerste regel.

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

Petrus: Dus, hoe nu verder? Heeft u configuraties voor supervisor?
Vasili: Nee, nee. Maar ik zal het snel doen.
Peter: Dan ga je het doen. Laten we nu een init-script schetsen dat alles zal starten. Oké, dus je start ssh, met nohup, zodat we verbinding kunnen maken met de container en kunnen zien wat er mis is gegaan. Voer vervolgens de supervisor op dezelfde manier uit. Nou, dan loop je gewoon als passagier.
Vraag: Maar ik heb gelezen dat er één proces zou moeten zijn, zodat Docker weet dat er iets mis is gegaan en de container opnieuw kan opstarten.
P: Val je hoofd niet lastig met onzin. En hoe in het algemeen? Hoe voer je dit allemaal in één proces uit? Laat Igor Ivanovich nadenken over stabiliteit, het is niet voor niets dat hij een salaris ontvangt. Onze taak is het schrijven van code. En laat hem in het algemeen bedanken dat we het Dockefile voor hem hebben geschreven.

10 minuten en twee video's over katten later.

Vraag: Ik heb alles gedaan. Ik heb meer opmerkingen toegevoegd.
P: Laat het me zien!

Nieuwste versie van 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: Geweldig, ik vind het leuk. En de commentaren zijn in het Russisch, handig en leesbaar, iedereen zou zo werken. Ik heb je alles geleerd, de rest kun je zelf doen. Laten we wat koffie gaan drinken...

Welnu, nu hebben we een volkomen verschrikkelijk Dockerfile, waarvan de aanblik ervoor zal zorgen dat Igor Ivanovich wil stoppen en zijn ogen nog een week pijn zullen doen. De Dockerfile kan natuurlijk nog erger zijn, er is geen limiet aan perfectie. Maar om te beginnen is dit voldoende.

Ik wil eindigen met een citaat van Grigory Oster:

Als je het nog niet zeker weet
Wij kozen het pad in het leven,
En je weet niet waarom
Begin uw arbeidsreis,
Breek de lampen in de gangen -
Mensen zullen ‘dankjewel’ tegen je zeggen.
Jij gaat de mensen helpen
Bespaar elektriciteit.

Bron: www.habr.com

Voeg een reactie