Докер: лош съвет

Докер: лош съвет

Когато се учех да карам кола, още на първия урок инструкторът влезе в кръстовището на заден ход и след това каза, че не трябва да правите това - никога. Запомних това правило веднага и за цял живот.

Четете „Лоши съвети“ от Григорий Остер на децата и виждате колко лесно и естествено им хрумва, че не трябва да правят това.

Изписани са много статии за това как да напишете правилно Dockerfile. Но не попаднах на инструкции как да пиша неправилни Dockerfiles. Запълвам тази празнина. И може би в проектите, които получавам подкрепа, ще има по-малко такива докер файлове.

Всички герои, ситуации и Dockerfile са измислени. Ако се разпознавате, извинете.

Създаване на Dockerfile, зловещ и ужасен

Петър (старши java/rubby/php разработчик): Колега Василий, качихте ли вече нов модул в Docker?
Василий (младши): Не, нямах време, не мога да го разбера с този Докер. Има толкова много статии за това, че е главозамайващо.

Петър: Имахме краен срок преди година. Нека ти помогна, ще го разберем в процеса. Кажете ми какво не работи за вас.

Василий: Не мога да избера основно изображение, така че да е минимално, но да има всичко необходимо.
Питър: Вземете изображението на ubuntu, има всичко, от което се нуждаете. И това, което е много ненужни неща, ще ви бъде полезно по-късно. И не забравяйте да поставите най-новия етикет, така че версията винаги да е най-новата.

И първият ред се появява в Dockerfile:

FROM ubuntu:latest

Питър: Какво следва, какво използвахме, за да напишем нашия модул?
Василий: И така, рубин, има уеб сървър и трябва да се стартират няколко сервизни демона.
Питър: Да, какво ни трябва: ruby, bundler, nodejs, imagemagick и какво още... И в същото време направете надграждане, за да получите определено нови пакети.
Василий: И ние няма да създадем потребител, за да не сме под root?
Петър: Майната му, тогава пак трябва да се гавриш с правата.
Василий: Имам нужда от време, около 15 минути, за да събера всичко в една команда, прочетох това...
(Питър грубо прекъсва педантичния и много умен младши.)
Петър: Пишете в отделни команди, ще бъде по-лесно за четене.

Dockerfile расте:

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

Тогава Игор Иванович, DevOps (но повече Ops, отколкото Dev), нахлува в офиса и крещи:

AI: Петя, твоите разработчици пак разбиха хранителната база данни, кога ще свърши това...

След малка схватка Игор Иванович се охлажда и започва да разбере какво правят колегите му тук.

AI: Какво правиш?
Василий: Питър ми помага да създам Dockerfile за нов модул.
AI: Нека да погледна... Какво си написал тук, почистваш хранилището с отделна команда, това е допълнителен слой... Но как да инсталираш зависимости, ако не си копирал Gemfile! И като цяло това не е добро.
Питър: Моля, заемете се с работата си, ще го разберем някак.

Игор Иванович въздъхва тъжно и тръгва да разбере кой е разбил базата данни.

Питър: Да, но той беше прав за кода, трябва да го вкараме в изображението. И нека веднага да инсталираме ssh и supervisor, в противен случай ще стартираме демоните.

Василий: Тогава първо ще копирам Gemfile и Gemfile.lock, след това ще инсталирам всичко и след това ще копирам целия проект. Ако Gemfile не се промени, слоят ще бъде взет от кеша.
Петър: Защо всички сте с тези слоеве, копирайте всичко наведнъж. Копирайте веднага. Първият ред.

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

Петър: И какво следва? Имате ли конфигурации за супервайзор?
Василий: Не, не. Но ще го направя бързо.
Петър: Тогава ще го направиш. Нека сега начертаем init скрипт, който ще стартира всичко. Добре, стартирате ssh с nohup, за да можем да се свържем с контейнера и да видим какво се е объркало. След това стартирайте supervisor по същия начин. Е, тогава просто изпълняваш пътник.
Въпрос: Но прочетох, че трябва да има един процес, така че Docker ще разбере, че нещо се е объркало и може да рестартира контейнера.
П: Не си занимавай главата с глупости. И въобще как? Как управлявате всичко това в един процес? Нека Игор Иванович мисли за стабилността, не напразно получава заплата. Нашата работа е да пишем код. И като цяло, нека благодари, че написахме Dockefile за него.

10 минути и два видеоклипа за котки по-късно.

Въпрос: Направих всичко. Добавих още коментари.
П: Покажи ми!

Най-новата версия на 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”]

П: Страхотно, харесва ми. И коментарите са на руски, удобни и четивни, всеки би работил така. Научих те на всичко, останалото можеш сам. Хайде да пием кафе...

Е, сега имаме съвършено ужасен Dockerfile, чийто вид ще накара Игор Иванович да иска да се откаже и очите му ще болят още една седмица. Dockerfile, разбира се, може да бъде още по-лош, няма ограничение за съвършенство. Но за начало това ще свърши работа.

Бих искал да завърша с цитат от Григорий Остер:

Ако все още не сте сигурни
Ние избрахме пътя в живота,
И вие не знаете защо
Започнете трудовия си път,
Счупете крушките в коридорите -
Хората ще ви кажат "Благодаря".
Ще помогнеш на хората
Пести електричество.

Източник: www.habr.com

Добавяне на нов коментар