Docker: masamang payo

Docker: masamang payo

Noong ako ay natututong magmaneho ng kotse, sa pinakaunang aralin ang tagapagturo ay nagmaneho sa intersection nang pabaligtad, at pagkatapos ay sinabi na hindi mo dapat gawin iyon - hindi kailanman. Naalala ko kaagad ang panuntunang ito at sa buong buhay ko.

Binabasa mo ang "Bad Advice" ni Grigory Oster sa mga bata, at nakikita mo kung gaano kadali at natural na naiisip nila na hindi nila dapat gawin ito.

Maraming mga artikulo ang naisulat sa kung paano magsulat ng isang Dockerfile nang tama. Ngunit hindi ako nakatagpo ng mga tagubilin kung paano magsulat ng mga maling Dockerfile. Pinupunan ko ang gap na ito. At baka sa mga proyektong natatanggap ko ang suporta, magkakaroon ng mas kaunting mga dockerfile.

Ang lahat ng mga character, sitwasyon at Dockerfile ay kathang-isip lamang. Kung nakilala mo ang iyong sarili, pasensya na.

Paglikha ng Dockerfile, nagbabala at kakila-kilabot

Peter (Senior java/rubby/php developer): Katuwang Vasily, nakapag-upload ka na ba ng bagong module sa Docker?
Vasily (junior): Hindi, wala akong oras, hindi ko maisip ito sa Docker na ito. Napakaraming artikulo tungkol dito, nakakahilo.

Peter: May deadline tayo noong isang taon. Hayaan mo akong tulungan ka, malalaman natin ito sa proseso. Sabihin sa akin kung ano ang hindi gumagana para sa iyo.

Vasily: Hindi ako makapili ng isang pangunahing larawan upang ito ay minimal, ngunit mayroon lahat ng kailangan mo.
Peter: Kunin ang imahe ng ubuntu, mayroon itong lahat ng kailangan mo. At kung ano ang maraming hindi kailangang bagay ay darating sa madaling gamiting mamaya. At huwag kalimutang ilagay ang pinakabagong tag upang ang bersyon ay palaging pinakabago.

At ang unang linya ay lilitaw sa Dockerfile:

FROM ubuntu:latest

Peter: Ano ang susunod, ano ang ginamit namin sa pagsulat ng aming modyul?
Vasily: Kaya ruby, mayroong isang web server at isang pares ng mga daemon ng serbisyo ay dapat ilunsad.
Peter: Oo, ano ang kailangan natin: ruby, bundler, nodejs, imagemagick at kung ano ano pa... At kasabay nito, mag-upgrade para siguradong makakuha ng mga bagong package.
Vasily: At hindi kami gagawa ng user para hindi kami ma-root?
Peter: Fuck it, tapos kailangan mo pang magpakatanga sa mga karapatan.
Vasily: Kailangan ko ng oras, mga 15 minuto, para pagsama-samahin ang lahat sa isang utos, nabasa ko iyon...
(Bastos na pinutol ni Pedro ang maselan at napakatalino na junior.)
Peter: Sumulat sa magkahiwalay na utos, mas madaling basahin.

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

Pagkatapos, si Igor Ivanovich, DevOps (ngunit mas maraming Ops kaysa Dev), ay pumasok sa opisina na sumisigaw:

AI: Petya, sinira muli ng iyong mga developer ang database ng pagkain, kailan ito matatapos...

Matapos ang isang maliit na labanan, lumamig si Igor Ivanovich at nagsimulang malaman kung ano ang ginagawa ng kanyang mga kasamahan dito.

AI: Anong ginagawa mo?
Vasily: Tinutulungan ako ni Peter na gumawa ng Dockerfile para sa isang bagong module.
AI: Let me take a look... Ano ang isinulat mo dito, nililinis mo ang repository na may hiwalay na command, ito ay isang karagdagang layer... Ngunit paano ka mag-install ng mga dependency kung hindi mo kinopya ang Gemfile! At sa pangkalahatan, hindi ito mabuti.
Peter: Mangyaring gawin ang iyong negosyo, malalaman namin ito kahit papaano.

Malungkot na bumuntong-hininga si Igor Ivanovich at umalis upang malaman kung sino ang sinira ang database.

Peter: Oo, ngunit tama siya tungkol sa code, kailangan nating itulak ito sa imahe. At agad nating i-install ang ssh at supervisor, kung hindi, sisimulan natin ang mga daemon.

Vasily: Pagkatapos ay kokopyahin ko muna ang Gemfile at Gemfile.lock, pagkatapos ay i-install ko ang lahat, at pagkatapos ay kokopyahin ko ang buong proyekto. Kung hindi magbabago ang Gemfile, kukunin ang layer mula sa cache.
Peter: Bakit kayong lahat sa mga layer na ito, kopyahin ang lahat nang sabay-sabay. Kopyahin agad. Ang pinakaunang linya.

Ang Dockerfile ngayon ay ganito ang hitsura:

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: So, ano ang susunod? Mayroon ka bang mga config para sa supervisor?
Vasily: Hindi, hindi. Ngunit gagawin ko ito nang mabilis.
Pedro: Kung gayon ay gagawin mo. Mag-sketch tayo ngayon ng init script na maglulunsad ng lahat. Okay, para simulan mo ang ssh, gamit ang nohup, para makakonekta tayo sa lalagyan at makita kung ano ang nangyari. Pagkatapos ay patakbuhin ang superbisor sa parehong paraan. Well, pagkatapos ay magpatakbo ka na lang ng pasahero.
Q: Ngunit nabasa ko na dapat mayroong isang proseso, para malaman ng Docker na may nangyaring mali at maaaring i-restart ang container.
P: Huwag mong istorbohin ang iyong ulo sa katarantaduhan. At sa pangkalahatan, paano? Paano mo pinapatakbo ang lahat ng ito sa isang proseso? Hayaang isipin ni Igor Ivanovich ang tungkol sa katatagan, hindi para sa wala na siya ay tumatanggap ng suweldo. Ang aming trabaho ay magsulat ng code. At sa pangkalahatan, hayaan siyang magpasalamat na isinulat namin ang Dockefile para sa kanya.

10 minuto at dalawang video tungkol sa mga pusa mamaya.

Q: Ginawa ko na ang lahat. Nagdagdag pa ako ng mga komento.
P: Ipakita mo sa akin!

Pinakabagong bersyon ng 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: Mahusay, gusto ko ito. At ang mga komento ay nasa Russian, maginhawa at nababasa, lahat ay gagana nang ganoon. Itinuro ko sa iyo ang lahat, maaari mong gawin ang natitira sa iyong sarili. Tara kape tayo...

Buweno, ngayon mayroon kaming isang ganap na kahila-hilakbot na Dockerfile, kung saan ang paningin ay gagawing gusto ni Igor Ivanovich na umalis at ang kanyang mga mata ay sasakit para sa isa pang linggo. Ang Dockerfile, siyempre, ay maaaring maging mas masahol pa, walang limitasyon sa pagiging perpekto. Ngunit para sa isang panimula, ito ay gagawin.

Gusto kong tapusin sa isang quote mula kay Grigory Oster:

Kung hindi ka pa sigurado
Pinili natin ang landas sa buhay,
At hindi mo alam kung bakit
Simulan ang iyong paglalakbay sa paggawa,
Basagin ang mga bombilya sa mga pasilyo -
Ang mga tao ay magsasabi ng "Salamat" sa iyo.
Tutulungan mo ang mga tao
Makatipid ng kuryente.

Pinagmulan: www.habr.com

Magdagdag ng komento