Докер: маслиҳати бад

Докер: маслиҳати бад

Вақте ки ман рондани мошинро ёд мегирифтам, дар дарси аввал инструктор ба чорроҳа бо баръакс даромад ва баъд гуфт, ки ин корро накунед - ҳеҷ гоҳ. Ман ин қоидаро дарҳол ва то охири умр ба ёд овардам.

Шумо «Маслиҳати бад»-и Григорий Остерро ба кӯдакон мехонед ва мебинед, ки чӣ гуна ба осонӣ ва табиист, ки онҳо набояд ин корро кунанд.

Дар бораи чӣ гуна дуруст навиштани Dockerfile мақолаҳои зиёде навишта шудаанд. Аммо ман дастурҳоро дар бораи навиштани нодурусти Dockerfiles надидам. Ман ин холигоҳро пур мекунам. Ва шояд дар лоиҳаҳое, ки ман дастгирӣ мегирам, чунин файлҳои докер-файл камтар хоҳанд буд.

Ҳама аломатҳо, вазъиятҳо ва Dockerfile афсонавӣ мебошанд. Агар шумо худро шинохтед, бубахшед.

Эҷоди як файли Docker, даҳшатнок ва даҳшатнок

Питер (таҳиягари калони java/rubby/php): Ҳамкор Василий, шумо аллакай модули навро ба Docker бор кардаед?
Василий (хурд): Не, ман вақт надоштам, ман инро бо ин Докер фаҳмида наметавонам. Дар бораи он мақолаҳои зиёде мавҷуданд, саргаранг аст.

Петрус: Мо як сол пеш мӯҳлат доштем. Иҷозат диҳед ба шумо ёрӣ диҳам, мо инро дар ин раванд муайян мекунем. Ба ман бигӯед, ки чӣ барои шумо кор намекунад.

Василий: Ман тасвири асосиро интихоб карда наметавонам, то он ҳадди аққал бошад, аммо ҳама чизеро, ки ба шумо лозим аст, дорад.
Петрус: Тасвири ubuntu-ро гиред, он ҳама чизро дорад, ки ба шумо лозим аст. Ва он чизе, ки бисёр чизҳои нолозим аст, баъдтар муфид хоҳад буд. Ва фаромӯш накунед, ки барчаспҳои навтаринро гузоред, то версия ҳамеша навтарин бошад.

Ва сатри аввал дар Dockerfile пайдо мешавад:

FROM ubuntu:latest

Петрус: Баъд чӣ аст, мо барои навиштани модули худ чӣ истифода кардем?
Василий: Пас, Руби, як веб-сервер вуҷуд дорад ва якчанд демонҳои хидматрасонӣ бояд оғоз шаванд.
Петрус: Бале, ба мо чӣ лозим аст: ruby, bundler, nodejs, imagemagick ва дигар чизҳо... Ва ҳамзамон, такмил диҳед, то ҳатман бастаҳои нав гиред.
Василий: Ва мо корбар эҷод намекунем, то зери реша набошем?
Петрус: Лаъй, пас шумо ба ҳар ҳол бояд бо ҳуқуқҳо фиреб хӯред.
Василий: Ба ман вақт лозим аст, тақрибан 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 (вале бештар аз Дев), ба офис дарида фарёд мезанад:

AI: Петя, таҳиягарони шумо боз базаи ғизоро шикастанд, ин кай ба охир мерасад...

Баъди задухурди начандон калон Игорь Иванович хунук шуда, ба фахмиданй мешавад, ки хамкасбонаш дар ин чо чй кор мекунанд.

AI: Шумо чӣ кор карда истодаед?
Василий: Петр ба ман кӯмак мекунад, ки барои модули нав Dockerfile эҷод кунам.
AI: Биёед ман бубинам ... Шумо дар ин ҷо чӣ навиштед, шумо репозиториро бо фармони алоҳида тоза мекунед, ин қабати иловагӣ аст... Аммо чӣ гуна шумо вобастагиҳоро насб мекунед, агар шумо Gemfile-ро нусхабардорӣ накарда бошед! Ва дар маҷмӯъ, ин хуб нест.
Петрус: Лутфан, ба кори худ равед, мо онро бо ягон роҳ ҳал мекунем.

Игорь Иванович бо андух ох мехурад ва меравад, то фахмад, ки базаро кй вайрон кардааст.

Петрус: Бале, аммо ӯ дар бораи рамз дуруст буд, мо бояд онро ба тасвир тела диҳем. Ва биёед фавран ssh ва супервайзерро насб кунем, вагарна мо демонҳоро оғоз мекунем.

Василий: Пас ман аввал 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 оғоз мекунед, то мо метавонем ба контейнер пайваст шавем ва бубинем, ки чӣ хато кардааст. Сипас супервайзерро бо ҳамин роҳ иҷро кунед. Хуб, пас шумо танҳо мусофирро идора мекунед.
Савол: Аммо ман хондам, ки бояд як раванд вуҷуд дошта бошад, бинобар ин Докер медонад, ки чизе хато кардааст ва метавонад контейнерро аз нав оғоз кунад.
П: Саратонро бо гапҳои бемаънӣ парешон накунед. Ва умуман, чӣ тавр? Чӣ тавр шумо ҳамаи инро дар як раванд иҷро мекунед? Бигзор Игор Иванович дар бораи устуворӣ фикр кунад, ин бесабаб нест, ки ӯ маош мегирад. Вазифаи мо навиштани код аст. Ва дар маҷмӯъ, бигзор ӯ ташаккур гӯяд, ки мо барои ӯ Dockfile навиштем.

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, албатта, метавонад аз ин ҳам бадтар бошад, барои комилият маҳдудият вуҷуд надорад. Аммо барои оғоз, ин кор хоҳад кард.

Ман мехостам бо як иқтибос аз Григорий Остер хотима диҳам:

Агар шумо ҳанӯз боварӣ надоред
Мо рохи зиндагиро интихоб кардем,
Ва шумо намедонед, ки чаро
Сафари меҳнатии худро оғоз кунед,
Лампаҳои барқро дар долонҳо шикастед -
Мардум ба шумо "ташаккур" мегӯянд.
Шумо ба мардум кумак мекунед
Энергияи электрро сарфа кунед.

Манбаъ: will.com

Илова Эзоҳ