Minu artikli kommentaarides oli palju palveid selgitada, kui kohutav on selles kirjeldatud Dockerfile.
Eelneva osa kokkuvÔte: kaks arendajat pingelise tÀhtaega silmas pidades koostavad Dockerfile'i. Protsessi kÀigus tuleb Ops Igor Ivanovits. LÔppenud Dockerfile on nii halb, et IA jÀÀb infarkti ÀÀrele.

NĂŒĂŒd uurime, mis on selle Dockerfile'iga valesti.
Nii et nÀdal on möödunud.
Dev Peeter kohtub sööklas kohvitassi taga Ops Igor Ivanovitsiga.
P: Igor Ivanovits, kas te olete vÀga hÔivatud? Tahaksime aru saada, kus me eksisime.
IA: HĂ€sti, ei ole tihti arendajaid, keda huvitab kasutamine.
Alustame mÔningate asjade kokkuleppimisest:
- Docker'i ideoloogia: ĂŒks konteiner â ĂŒks protsess.
- Mida vÀiksem konteiner, seda parem.
- Mida rohkem vÔetakse vahemikust, seda parem.
P: Miks peab ĂŒhes konteineris olema ĂŒks protsess?
IA: Docker jĂ€lgib konteineri kĂ€ivitamisel protsessi olekut pid 1. Kui protsess sureb, ĂŒritab Docker konteinerit uuesti kĂ€ivitada. Kui teil on konteineris mitu rakendust vĂ”i peamine rakendus ei tööta pid 1 pealt, siis Docker ei saa teada, kui protsess sureb.
Kui kĂŒsimusi pole, nĂ€ita oma Dockerfile'i.
Ja Peeter nÀitas:
FROM ubuntu:latest
# Kopeerime lÀhtekoodi
COPY .\/\/app
WORKDIR \/app
# Uuendame paketiluettelo
RUN apt-get update
# Uuendame pakette
RUN apt-get upgrade
# Paigaldame vajalikud pakettid
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor
# Paigaldame bundleri
RUN gem install bundler
# Paigaldame nodejs, mida kasutatakse staatika kogumiseks
RUN curl -sL https:\/\/deb.nodesource.com\/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
# Paigaldame sÔltuvused
RUN bundle install --without development test --path vendor\/bundle
# Koristame pÀrast end
RUN rm -rf \/usr\/local\/bundle\/cache\/*.gem
RUN apt-get clean
RUN rm -rf \/var\/lib\/apt\/lists\/* \/tmp\/* \/var\/tmp\/*
RUN rake assets:precompile
# KÀivitame skripti, kui konteiner kÀivitatakse, mis kÀivitab kÔik muu.
CMD ["\/app\/init.sh"]IA: Oh, alustame jÀrjekorras. Alustame esimesest reast:
FROM ubuntu:latestTe vÔtate sildi latest. Sildi kasutamine latest toob kaasa ettearvamatud tagajÀrjed. Kujutage ette, et pildi hooldaja kogub uue versiooni, millel on erinev tarkvarade loetelu, see pilt saab sildi latest. Ja teie konteiner, parimal juhul, lÔpetab koostamise, halvemal juhul tabate vigu, mida varem polnud.
Sa vĂ”tate kujutise tĂ€iskohaga opsĂŒsteemist, kus on palju kasutud rakendusi, mis suurendavad konteineri mahtu. Ja mida rohkem rakendusi, seda rohkem on auke ja haavatavusi.
Lisaks, mida suurem on kujutis, seda rohkem ruumi see vÔtab hostis ja registris (sa ikka hoiad kuskil neid kujutisi)?
K: Jah, muidugi, meil on registri, sa ju seadistasid selle.
AI: Nii, millest ma rÀÀgin?.. Ah, jah, mahud... Koormus kasvab ka vĂ”rku. Ăhe kujutise korral pole see mĂ€rgatav, kuid kui toimub pidev ehitamine, testimine ja juurutamine, on see tuntav. Ja kui sul pole AWS-is jumala reĆŸiimi, saad veel kosmilise arve.
SeetÔttu on oluline valida sobivaim kujutis, tÀpse versiooniga ja minimaalsete rakendustega. NÀiteks vÔta: FROM ruby:2.5.5-stretch
K: Okei, selge. Kuidas ja kus vaadata olemasolevaid kujutisi? Kuidas mÔista, milline mulle sobib?
AI: Tavaliselt vÔetakse kujutised : kujutised on koostatud minimalistlikust Linuxi kujutisest, ainult 5 MB. Selle miinus: see on koostatud oma libc rakendusega, standardpaketid ei tööta. Vajalikku paketti otsimine ja installimine vÔtab palju aega.
EttevÔte Canonical on juba: pÔhikujutis, ei kasutata teiste kujutiste koostamiseks. See on mÔeldud ainult ettevalmistatud andmete kÀivitamiseks. Sobib suurepÀraselt binaarsete rakenduste kÀitamiseks, mis sisaldavad kÔike vajalikku, nÀiteks Go-rakendusi.
ScratchMĂ”ne operatsioonisĂŒsteemi, nagu Ubuntu vĂ”i Debian, pĂ”hjal. No, siin arvan, et ei pea selgitama.
AI: NĂŒĂŒd peame installima kĂ”ik lisapaketid ja oma vahehaarded puhastama. Ja kohe saab visata Ă€ra
apt-get upgrade. Muudest, igal ehitamisel, hoolimata pĂ”hifaili fikseeritud sildist, saavad erinevad kujutised. Pakettide uuendamine kujutises on hooldaja ĂŒlesanne ja see kaasneb sildi muutmisega.K: Jah, ma proovisin seda teha, mul Ă”nnestus nii:
WORKDIR /app COPY ./ /appRUN curl -sL https://deb.nodesource.com/setup_9.x | bash - && apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor nodejs && gem install bundler && bundle install --without development test --path vendor/bundleRUN rm -rf /usr/local/bundle/cache/*.gem && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
AI: Ăsna hea, aga siin on veel, millega töötada. Vaata, see kĂ€sk:RUN rm -rf /usr/local/bundle/cache/*.gem && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN rm -rf /usr/local/bundle/cache/*.gem
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ⊠ei eemalda andmeid lĂ”plikust pildist, vaid loob lihtsalt lisakihi nende andmete ilma. Ăige on nii:
RUN curl -sL https://deb.nodesource.com/setup_9.x | bash -
&& apt-get -y install libpq-dev imagemagick gsfonts nodejs
&& gem install bundler
&& bundle install --without development test --path vendor/bundle
&& rm -rf /usr/local/bundle/cache/*.gem
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* Aga see ei ole veel kÔik. Mis teil seal on, Ruby? Siis ei ole vaja projekti alguses kogu projekti kopeerida. Piisab, kui kopeerite Gemfile'i ja Gemfile.locki.
Sellise lÀhenemise korral ei toimu bundle install iga muutumise korral, vaid ainult siis, kui Gemfile vÔi Gemfile.lock on muutunud.
Samad meetodid kehtivad ka teiste keelte jaoks, kus on sÔltuvuste haldur, nagu npm, pip, composer ja teised, mis pÔhinevad sÔltuvuste loendi failil.
Ja lĂ”puks, kas sa mĂ€letad, et ma mainisin Docker'i ideoloogiat âĂŒks konteiner â ĂŒks protsessâ? See tĂ€hendab, et supervisorit ei ole vaja. Samuti ei tasu installida systemd, samadel pĂ”hjustel. Tegelikult on Docker ise supervisor. Ja kui pĂŒĂŒad selles kĂ€ivitada mitu protsessi, on see nagu ĂŒhes protsessis supervisoris kĂ€ivitada mitu rakendust.
Kogumise ajal loobite te ĂŒhe pildi ja seejĂ€rel kĂ€ivitate soovitud arvu konteinerit, nii et igas töötab ĂŒks protsess.
Aga sellest hiljem.
K: Tundub, et sain aru. Vaata, mis vÀlja tuleb:
FROM ruby:2.5.5-stretch
WORKDIR /app
COPY Gemfile* /app
RUN curl -sL https://deb.nodesource.com/setup_9.x | bash -
&& apt-get -y install libpq-dev imagemagick gsfonts nodejs
&& gem install bundler
&& bundle install --without development test --path vendor/bundle
&& rm -rf /usr/local/bundle/cache/*.gem
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY . /app
RUN rake assets:precompile
CMD ["bundleâ, âexecâ, âpassengerâ, âstart"]Ja kas me ĂŒletame deemonite kĂ€ivitamise konteineri kĂ€ivitamisel?
AI: Jah, kÔik on Ôige. Muide, saate kasutada nii CMD-d kui ka ENTRYPOINT-i. Ja lahendada, milles vahe on, see on sulle kodutöö. Selle kohta on Habr's head artiklid. .
Nii, jÀtkame. Sa laadid alla node'i installifaili, kuid samal ajal ei ole mingit garantiid, et seal on see, mida vajad. Siia tuleb lisada valideerimine. NÀiteks nii:
RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x
&& echo "958c9a95c4974c918dca773edf6d18b1d1a41434 setup_9.x" | sha1sum -c -
&& bash setup_9.x
&& rm -rf setup_9.x
&& apt-get -y install libpq-dev imagemagick gsfonts nodejs
&& gem install bundler
&& bundle install --without development test --path vendor/bundle
&& rm -rf /usr/local/bundle/cache/*.gem
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* Kontrollsummas kontrollimise abil saad veenduda, et oled Ôige faili alla laadinud.
K: Aga kui fail muutub, siis kogu protsess ebaÔnnestub.
AI: Jah, ja see on kummaliselt hea, et see nii on. Sa saad teada, et fail on muutunud, ja saad vaadata, mis seal on muutunud. Kes teab, vÔib-olla on seal nÀiteks skript, mis kustutab kÔik, millele see ulatub, vÔi teeb ukse tagant sissepÀÀsu.
K: AitÀh. Tundub, et lÔpuks Dockerfile nÀeb vÀlja selline:
FROM ruby:2.5.5-stretch
WORKDIR /app
COPY Gemfile* /app
RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x
&& echo "958c9a95c4974c918dca773edf6d18b1d1a41434 setup_9.x" | sha1sum -c -
&& bash setup_9.x
&& rm -rf setup_9.x
&& apt-get -y install libpq-dev imagemagick gsfonts nodejs
&& gem install bundler
&& bundle install --without development test --path vendor/bundle
&& rm -rf /usr/local/bundle/cache/*.gem
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY . /app
RUN rake assets:precompile
CMD ["bundle", "exec", "passenger", "start"]K: Igor Ivanovitƥ, aitÀh abi eest. Mul on juba aeg minna, pean tÀna veel 10 kommiti tegema.
Igor IvanovitĆĄ, peatades kiirustava kolleegi pilguga, vĂ”tab lonksu tugevat kohvi. MĂ”tlemiseks kulub paar sekundit SLA 99.9% ja bugivabade koodide ĂŒle, seejĂ€rel kĂŒsib ta.
AI: Kus te logisid hoiate?
K: Loomulikult production.log-s. Ăks hetk, kuidas me ilma ssh ta juurde ligi pÀÀseme?
AI: Kui te jÀtate need failidesse, on lahendus teie jaoks juba vÀlja mÔeldud. KÀsk docker exec vÔimaldab teil kÀivitada igasuguseid kÀske konteineris. NÀiteks vÔite logide vaatamiseks kasutada cat kÀsku. Ja kui kasutate vÔtme -it ja kÀivitate bash-i (kui see on konteineris installitud), siis saate interaktiivse juurdepÀÀsu konteinerile.
Aga logide failides hoidmine ei ole mÔistlik. KÔige vÀhem viib see konteineri kontrollimatu kasvuni, sest keegi ei rotatsiooni tee logisid. KÔik logid tuleks suunata stdout-i. Sealt saate neid vaadata kÀsu docker logs.
K: Igor IvanovitĆĄ, aga kas ei oleks vĂ”imalik loge viia monteeritud kausta, fĂŒĂŒsilisse nodi, nagu kasutajate andmed?
AI: Hea, et te ei unustanud vÀlja viia andmeid, mis on salvestatud nodi kettale. Logide puhul on ka vÔimalik, lihtsalt Àra unustage rotatsiooni seadistamist.
KÔik, saad minna.
P: Igor Ivanovich, soovitaksite, mida lugeda?
AI: Alustuseks loe , tÔenÀoliselt ei tea keegi Docker'ist paremini kui nemad.
Ja kui soovid praktikat, mine . Teooria ilma praktikata on surnud.
Allikas: habr.com
