Docker: ushauri mbaya

Docker: ushauri mbaya

Nilipokuwa nikijifunza kuendesha gari, katika somo la kwanza kabisa mwalimu aliendesha gari kwenye makutano kinyume chake, kisha akasema kwamba haupaswi kufanya hivyo - kamwe. Nilikumbuka sheria hii mara moja na kwa maisha yangu yote.

Unasoma "Ushauri Mbaya" na Grigory Oster kwa watoto, na unaona jinsi kwa urahisi na kwa kawaida inavyoonekana kwao kwamba hawapaswi kufanya hivi.

Nakala nyingi zimeandikwa juu ya jinsi ya kuandika Dockerfile kwa usahihi. Lakini sikupata maagizo ya jinsi ya kuandika Dockerfiles zisizo sahihi. Ninajaza pengo hili. Na labda katika miradi ambayo ninapokea usaidizi, kutakuwa na faili ndogo kama hizo.

Wahusika wote, hali na Dockerfile ni za uwongo. Ikiwa unajitambua, samahani.

Kuunda faili ya Docker, ya kutisha na ya kutisha

Peter (Msanidi programu mkuu wa java/rubby/php): Mwenzake Vasily, je, tayari umepakia moduli mpya kwenye Docker?
Vasily (junior): Hapana, sikuwa na wakati, siwezi kujua na Docker hii. Kuna makala nyingi juu yake, ni kizunguzungu.

Peter: Tulikuwa na tarehe ya mwisho mwaka mmoja uliopita. Ngoja nikusaidie, tutaibaini katika mchakato. Niambie ni nini hakifai kwako.

Vasily: Siwezi kuchagua picha ya msingi ili iwe ndogo, lakini ina kila kitu unachohitaji.
Peter: Chukua picha ya ubuntu, ina kila kitu unachohitaji. Na ni nini mambo mengi yasiyo ya lazima yatakuja kwa manufaa baadaye. Na usisahau kuweka lebo ya hivi karibuni ili toleo liwe la hivi karibuni kila wakati.

Na mstari wa kwanza unaonekana kwenye Dockerfile:

FROM ubuntu:latest

Peter: Nini kinafuata, tulitumia nini kuandika moduli yetu?
Vasily: Kwa hivyo ruby, kuna seva ya wavuti na daemoni kadhaa za huduma zinapaswa kuzinduliwa.
Peter: Ndio, tunahitaji nini: ruby, bundler, nodejs, imagemagick na nini kingine... Na wakati huo huo, fanya sasisho ili kupata vifurushi vipya.
Vasily: Na hatutaunda mtumiaji ili tusiwe chini ya mizizi?
Peter: Fuck it, basi bado unapaswa kujidanganya na haki.
Vasily: Nahitaji muda, kama dakika 15, ili kuweka yote pamoja katika amri moja, nilisoma ...
(Peter anamkatiza kwa jeuri yule mdogo mwenye uangalifu na mwenye akili sana.)
Peter: Andika kwa amri tofauti, itakuwa rahisi kusoma.

Dockerfile inakua:

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

Kisha Igor Ivanovich, DevOps (lakini Ops zaidi kuliko Dev), akaingia ofisini akipiga kelele:

AI: Petya, watengenezaji wako walivunja hifadhidata ya chakula tena, hii itaisha lini...

Baada ya mzozo mdogo, Igor Ivanovich anatulia na kuanza kujua wenzake wanafanya nini hapa.

AI: Unafanya nini?
Vasily: Peter ananisaidia kuunda Dockerfile kwa moduli mpya.
AI: Hebu niangalie ... Uliandika nini hapa, unasafisha hifadhi kwa amri tofauti, hii ni safu ya ziada ... Lakini unawezaje kufunga utegemezi ikiwa hujanakili Gemfile! Na kwa ujumla, hii sio nzuri.
Peter: Tafadhali endelea na biashara yako, tutaijua kwa njia fulani.

Igor Ivanovich anaugua kwa huzuni na kuondoka ili kujua ni nani aliyevunja hifadhidata.

Peter: Ndiyo, lakini alikuwa sahihi kuhusu kanuni, tunahitaji kuisukuma kwenye picha. Na wacha tusakinishe ssh na msimamizi mara moja, vinginevyo tutaanza daemons.

Vasily: Kisha nitakili kwanza Gemfile na Gemfile.lock, kisha nitaweka kila kitu, na kisha nitakili mradi mzima. Ikiwa Gemfile haibadilika, safu itachukuliwa kutoka kwa kache.
Peter: Kwa nini ninyi nyote na tabaka hizi, nakala kila kitu mara moja. Nakili mara moja. Mstari wa kwanza kabisa.

Dockerfile sasa inaonekana kama hii:

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

Peter: Kwa hiyo, nini baadaye? Je! una mipangilio ya msimamizi?
Vasily: Hapana, hapana. Lakini nitafanya haraka.
Peter: Basi utafanya hivyo. Wacha sasa tuchore hati ya init ambayo itazindua kila kitu. Sawa, kwa hivyo uanze ssh, na nohup, ili tuweze kuunganisha kwenye kontena na kuona ni nini kilienda vibaya. Kisha endesha msimamizi kwa njia ile ile. Kweli, basi unaendesha abiria tu.
Swali: Lakini nilisoma kwamba kunapaswa kuwa na mchakato mmoja, kwa hivyo Docker atajua kuwa kuna kitu kilienda vibaya na anaweza kuanzisha tena kontena.
P: Usisumbue kichwa chako na upuuzi. Na kwa ujumla, vipi? Unaendeshaje haya yote katika mchakato mmoja? Acha Igor Ivanovich afikirie juu ya utulivu, sio bure kwamba anapokea mshahara. Kazi yetu ni kuandika kanuni. Na kwa ujumla, aseme asante kwamba tulimwandikia Dockefile.

Dakika 10 na video mbili kuhusu paka baadaye.

Swali: Nimefanya kila kitu. Nimeongeza maoni zaidi.
P: Nionyeshe!

Toleo la hivi karibuni la 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: Mkuu, napenda. Na maoni yako kwa Kirusi, yanafaa na yanasomeka, kila mtu angefanya kazi kama hiyo. Nilikufundisha kila kitu, unaweza kufanya wengine mwenyewe. Twende tukanywe kahawa...

Kweli, sasa tuna Dockerfile ya kutisha kabisa, kuona ambayo itafanya Igor Ivanovich kutaka kuacha na macho yake yataumiza kwa wiki nyingine. Dockerfile, bila shaka, inaweza kuwa mbaya zaidi, hakuna kikomo kwa ukamilifu. Lakini kwa mwanzo, hii itafanya.

Ningependa kumalizia na nukuu kutoka kwa Grigory Oster:

Kama huna uhakika bado
Tulichagua njia maishani,
Na hujui kwa nini
Anza safari yako ya kazi,
Vunja balbu za taa kwenye barabara za ukumbi -
Watu watasema "Asante" kwako.
Utawasaidia watu
Okoa umeme.

Chanzo: mapenzi.com

Kuongeza maoni