Docker: шкодныя парады

Docker: шкодныя парады

Калі я вучыўся вадзіць машыну, на першым жа занятку інструктар выехаў на скрыжаванне заднім ходам, а потым сказаў, што рабіць так нельга - наогул ніколі. Гэтае правіла я запомніў адразу і на ўсё жыццё.

Чытаеш дзецям "Шкодныя парады" Рыгора Остэра, і бачыш, як лёгка і нязмушана да іх даходзіць, што так рабіць нельга.

Аб тым, як правільна пісаць Dockerfile, напісана куча артыкулаў. Але мне не траплялася інструкцый, як пісаць няправільныя Dockerfile. Папаўняю гэты прабел. І, магчыма, у праектах, якія я атрымліваю на падтрымку, такіх докерфайлаў стане менш.

Усе героі, сітуацыі і Dockerfile выдуманыя. Калі вы пазналі сябе, сорри.

Ствараем Dockerfile, злавесны і жудасны

Пётр (Senior java/rubby/php developer): Калега Васіль, вы ўжо залілі ў Docker новы модуль?
Васіль (junior): Не, не паспеў, ніяк не разбяруся з гэтым Docker. Гэтулькі артыкулаў па ім, вочы разбягаюцца.

Пётр: У нас дэдлайн год таму выйшаў. Давай дапамагу, у працэсе разбярэмся. Расказвай, што там у цябе не атрымліваецца.

Васіль: Не магу абраць базавую выяву, каб мінімальная, але было ўсё, што трэба.
Пётр: Бяры выяву ubuntu, у ім ёсць усё, што трэба. А што шмат лішняга, потым яшчэ спатрэбіцца. І не забудзься паставіць тэг latest, каб версія заўсёды была самая апошняя.

І ў Dockerfile з'яўляецца першы радок:

FROM ubuntu:latest

Пётр: Што тамака далей, на чым мы пісалі наш модуль?
Васіль: Дык ruby ​​жe, там вэб сервер і пара службовых дэманаў павінна запускацца.
Пётр: Ага, што нам трэба: ruby, bundler, nodejs, imagemagick ну і што там яшчэ… І заадно, зрабі upgrade, каб сапраўды атрымаць новыя пакеты.
Васіль: А карыстальніка не будзем ствараць, каб не з-пад 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), з крыкамі:

ІІ: Пеця, твае распрацоўшчыкі зноў разламалі прад БД, калі ж гэта скончыцца….

Пасля невялікай сваркі Ігар Іванавіч астывае і пачынае высвятляць, чым калегі тут займаюцца.

ІІ: Чым занятыя?
Васіль: Пётр дапамагае мне скласці Dockerfile для новага модуля.
ІІ: Дайце зірнуць… Ды што вы тут панапісалі, вы ж рэпазітар чысціце асобнай камандай, гэта ж дадатковы пласт… Ды як жа вы ставіце залежнасці, калі не скапіявалі 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/* 

Пётр: Так, што далей. У цябе ёсць канфігі для supervisor?
Васіль: Яе, няма. Але я хутка зраблю.
Пётр: Потым зробіш. Давай зараз накідаем init скрыпт, які будзе ўсё запускаць. Так-с, значыць, запускаеш ssh, з nohup, каб мы маглі падлучыцца да кантэйнера і паглядзець, што пайшло не так. Затым гэтак жа запускай supervisor. Ну і потым проста запусціш passenger.
У: Але я чытаў, што павінен быць адзін працэс, так 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, вядома ж, мог быць яшчэ горш, няма мяжы дасканаласці. Але для пачатку і так сыдзе.

Скончыць хацелася б цытатай Рыгора Остэра:

Калі вы яшчэ не цвёрда
У жыцці абралі дарогу,
І не ведаеце, з чаго б
Працоўны свой шлях пачаць,
Біце лямпачкі ў пад'ездах
Людзі скажуць вам "Дзякуй".
Вы дапаможаце народу
Электрычнасць берагчы.

Крыніца: habr.com

Дадаць каментар