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