Docker: këshilla e keqe

Docker: këshilla e keqe

Kur po mësoja të drejtoja një makinë, në mësimin e parë instruktori u fut në kryqëzim në drejtim të kundërt, dhe më pas tha që nuk duhet ta bëni këtë - kurrë fare. Këtë rregull e kujtova menjëherë dhe për gjithë jetën.

Ju lexoni "Këshillat e këqija" nga Grigory Oster për fëmijët dhe shihni se sa lehtë dhe natyrshëm u duket atyre që nuk duhet ta bëjnë këtë.

Janë shkruar shumë artikuj se si të shkruani saktë një Dockerfile. Por nuk kam hasur në udhëzime se si të shkruaj Dockerfiles të pasaktë. Po e mbush këtë boshllëk. Dhe ndoshta në projektet që unë marr mbështetje, do të ketë më pak skedarë të tillë docker.

Të gjithë personazhet, situatat dhe Dockerfile janë fiktive. Nëse e njeh veten, më fal.

Krijimi i një skedari Docker, ogurzi dhe i tmerrshëm

Peter (zhvillues i vjetër i Java/rubby/php): Koleg Vasily, a keni ngarkuar tashmë një modul të ri në Docker?
Vasily (junior): Jo, nuk pata kohë, nuk mund ta kuptoj me këtë Docker. Ka kaq shumë artikuj për të, është marramendëse.

Peter: Kishim një afat një vit më parë. Më lejoni t'ju ndihmoj, ne do ta kuptojmë gjatë procesit. Më thuaj çfarë nuk funksionon për ty.

Vasily: Nuk mund të zgjedh një imazh bazë që të jetë minimal, por të ketë gjithçka që ju nevojitet.
Peter: Merrni imazhin e ubuntu, ai ka gjithçka që ju nevojitet. Dhe ajo që ka shumë gjëra të panevojshme do të jetë e dobishme më vonë. Dhe mos harroni të vendosni etiketën më të fundit në mënyrë që versioni të jetë gjithmonë më i fundit.

Dhe rreshti i parë shfaqet në Dockerfile:

FROM ubuntu:latest

Peter: Çfarë është më pas, çfarë kemi përdorur për të shkruar modulin tonë?
Vasily: Pra, rubin, ka një server në internet dhe duhet të lansohen disa demonë shërbimi.
Peter: Po, çfarë na nevojitet: rubin, bundler, nodejs, imagemagick dhe çfarë tjetër... Dhe në të njëjtën kohë, bëni një përmirësim për të marrë patjetër paketa të reja.
Vasily: Dhe ne nuk do të krijojmë një përdorues në mënyrë që të mos jemi nën rrënjë?
Pjetri: Dreq, atëherë duhet të mashtrosh akoma me të drejtat.
Vasily: Më duhet kohë, rreth 15 minuta, për t'i bashkuar të gjitha në një komandë, lexova se ...
(Pjetri ndërpret në mënyrë të vrazhdë të voglin e përpiktë dhe shumë të zgjuar.)
Pjetri: Shkruani në komanda të veçanta, do të jetë më e lehtë për t'u lexuar.

Dockerfile rritet:

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

Pastaj Igor Ivanovich, DevOps (por më shumë Ops se Dev), shpërthen në zyrë duke bërtitur:

AI: Petya, zhvilluesit tuaj thyen përsëri bazën e të dhënave të ushqimit, kur do të përfundojë kjo...

Pas një përleshjeje të vogël, Igor Ivanovich ftohet dhe fillon të zbulojë se çfarë po bëjnë kolegët e tij këtu.

AI: Çfarë po bën?
Vasily: Peter po më ndihmon të krijoj një Dockerfile për një modul të ri.
AI: Më lejoni t'i hedh një sy... Çfarë keni shkruar këtu, ju pastroni depon me një komandë të veçantë, kjo është një shtresë shtesë... Por si i instaloni varësitë nëse nuk keni kopjuar Gemfile! Dhe në përgjithësi, kjo nuk është e mirë.
Peter: Ju lutemi shkoni për biznesin tuaj, ne do ta kuptojmë disi.

Igor Ivanovich psherëtin i trishtuar dhe largohet për të kuptuar se kush e ka thyer bazën e të dhënave.

Peter: Po, por ai kishte të drejtë për kodin, ne duhet ta shtyjmë atë në imazh. Dhe le të instalojmë menjëherë ssh dhe mbikëqyrës, përndryshe do të fillojmë demonët.

Vasily: Atëherë unë fillimisht do të kopjoj Gemfile dhe Gemfile.lock, pastaj do të instaloj gjithçka dhe më pas do të kopjoj të gjithë projektin. Nëse Gemfile nuk ndryshon, shtresa do të merret nga cache.
Pjetri: Pse jeni të gjithë me këto shtresa, kopjoni gjithçka menjëherë. Kopjojeni menjëherë. Rreshti i parë.

Dockerfile tani duket kështu:

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

Pjetri: Pra, çfarë më pas? A keni konfigurime për mbikëqyrësin?
Vasily: Jo, jo. Por do ta bëj shpejt.
Pjetri: Atëherë do ta bësh. Le të skicojmë tani një skenar init që do të nisë gjithçka. Në rregull, kështu që ju filloni ssh, me nohup, në mënyrë që të lidhemi me kontejnerin dhe të shohim se çfarë shkoi keq. Pastaj drejtoni mbikëqyrësin në të njëjtën mënyrë. Epo, atëherë ju thjesht drejtoni pasagjer.
Pyetje: Por lexova se duhet të ketë një proces, kështu që Docker do të dijë se diçka nuk shkoi keq dhe mund të rinisë kontejnerin.
P: Mos e mërzit kokën me marrëzi. Dhe në përgjithësi, si? Si i bëni të gjitha këto në një proces? Lëreni Igor Ivanovich të mendojë për stabilitetin, nuk është më kot që ai merr një rrogë. Detyra jonë është të shkruajmë kodin. Dhe në përgjithësi, le të thotë faleminderit që kemi shkruar Dockfile për të.

10 minuta dhe dy video për macet më vonë.

Pyetje: Unë kam bërë gjithçka. Shtova më shumë komente.
P: Më trego!

Versioni i fundit i 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: E shkëlqyeshme, më pëlqen. Dhe komentet janë në Rusisht, të përshtatshme dhe të lexueshme, të gjithë do të punonin kështu. Të kam mësuar gjithçka, të tjerat mund ta bësh vetë. Le të shkojmë të pimë një kafe ...

Epo, tani kemi një Dockerfile krejtësisht të tmerrshëm, shikimi i të cilit do ta bëjë Igor Ivanovich të dëshirojë të heqë dorë dhe sytë e tij do të lëndohen për një javë tjetër. Dockerfile, natyrisht, mund të jetë edhe më keq, nuk ka kufi për përsosmërinë. Por për një fillim, kjo do të ndodhë.

Do të doja ta mbyllja me një citim nga Grigory Oster:

Nëse nuk jeni ende i sigurt
Ne zgjodhëm rrugën e jetës,
Dhe nuk e dini pse
Filloni udhëtimin tuaj të punës,
Thyeni llambat në korridore -
Njerëzit do t'ju thonë "Faleminderit".
Ju do të ndihmoni njerëzit
Kurseni energjinë elektrike.

Burimi: www.habr.com

Shto një koment