Docker: dili daotan nga tambag

Sa mga komento sa akong artikulo Docker: dili maayo nga tambag adunay daghang mga hangyo aron ipasabut kung ngano nga ang Dockerfile nga gihulagway niini makalilisang kaayo.

Summary sa miaging yugto: Duha ka mga developers ang naglangkob sa usa ka Dockerfile ubos sa usa ka hugot nga deadline. Sa proseso, ang Ops Igor Ivanovich moabut kanila. Ang resulta nga Dockerfile daotan kaayo nga ang AI anaa sa tumoy sa atake sa kasingkasing.

Docker: dili daotan nga tambag

Karon atong mahibal-an kung unsa ang sayup sa kini nga Dockerfile.

So, nilabay ang usa ka semana.

Nahimamat ni Dev Petya si Ops Igor Ivanovich sa kan-anan sa usa ka tasa nga kape.

P: Igor Ivanovich, busy ka kaayo? Gusto nako mahibal-an kung diin kami nagkagubot.

AI: Maayo kana, dili ka kanunay makahimamat sa mga developer nga interesado sa pagpahimulos.
Una, magkasinabot kita sa pipila ka butang:

  1. Ideolohiya sa Docker: usa ka sudlanan - usa ka proseso.
  2. Ang gamay nga sudlanan, mas maayo.
  3. Kon mas daghan ang imong gikuha gikan sa cache, mas maayo.

P: Nganong kinahanglan adunay usa ka proseso sa usa ka sudlanan?

AI: Ang Docker, sa pagsugod sa usa ka sudlanan, nag-monitor sa kahimtang sa proseso sa pid 1. Kung ang proseso mamatay, ang Docker mosulay sa pag-restart sa sudlanan. Ingnon ta nga adunay daghang mga aplikasyon nga nagdagan sa usa ka sudlanan, o ang panguna nga aplikasyon wala nagdagan sa pid 1. Kung ang proseso mamatay, ang Docker dili mahibal-an bahin niini.

Kung wala ka'y ​​dugang nga mga pangutana, palihug ipakita kanamo ang imong Dockerfile.

Ug gipakita ni Petya:

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/* 
RUN rake assets:precompile
# Запускаем скрипт, при старте контейнера, который запустит все остальное.
CMD ["/app/init.sh"]

AI: Aw, kuhaan ta sa han-ay. Magsugod kita sa unang linya:

FROM ubuntu:latest

Gikuha nimo ang tag latest. Gamit ug tag latest modala ngadto sa dili matag-an nga mga sangputanan. Hunahunaa, ang tigdumala sa imahe nagtukod usa ka bag-ong bersyon sa imahe nga adunay lahi nga lista sa software, kini nga imahe nakadawat sa labing bag-ong tag. Ug ang imong sudlanan, sa labing maayo, mohunong sa pagtukod, ug sa pinakagrabe, imong makuha ang mga bug nga wala pa kaniadto.

Nagkuha ka usa ka imahe nga adunay usa ka bug-os nga OS nga adunay daghang wala kinahanglana nga software, nga nagpadako sa gidaghanon sa sudlanan. Ug ang mas daghang software, mas daghang mga lungag ug mga kahuyangan.

Dugang pa, kon mas dako ang hulagway, mas daghang luna ang gikinahanglan sa host ug sa registry (gitipigan ba nimo ang mga hulagway sa usa ka dapit)?

P: Oo, siyempre, naa tay registry, imong gi-set up.

AI: So, unsa man ang akong gihisgutan? Alang sa usa ka imahe dili kini mamatikdan, apan kung adunay padayon nga pagtukod, mga pagsulay ug pag-deploy, kini mamatikdan. Ug kung wala kay mode sa Diyos sa AWS, makakuha ka usab usa ka cosmic bill.

Busa, kinahanglan nimo nga pilion ang labing angay nga imahe, nga adunay eksaktong bersyon ug minimum nga software. Pananglitan, kuhaa: FROM ruby:2.5.5-stretch

P: Aw, nakita nako. Giunsa ug asa nako matan-aw ang anaa nga mga hulagway? Unsaon nako pagkahibalo kung hain ang akong gikinahanglan?

AI: Kasagaran ang mga hulagway gikuha gikan sa dockerhub, ayaw paglibog sa pornhub :). Kasagaran adunay daghang mga asembliya alang sa usa ka imahe:
Alpine: Ang mga hulagway gikolekta sa usa ka minimalistic nga imahe sa Linux, 5 MB lang. Ang disbentaha niini: kini gihugpong sa kaugalingon nga pagpatuman sa libc, ang mga standard nga pakete dili molihok niini. Ang pagpangita ug pag-instalar sa gikinahanglan nga pakete magkinahanglan og daghang panahon.
Scratch: base nga imahe, wala gigamit sa paghimo sa ubang mga imahe. Kini gituyo lamang alang sa pagpadagan sa binary, andam nga datos. Maayo alang sa pagpadagan sa binary nga mga aplikasyon nga naglakip sa tanan nga imong kinahanglan, sama sa mga aplikasyon sa GO.
Base sa bisan unsang OS, sama sa Ubuntu o Debian. Aw, sa akong hunahuna dili kinahanglan nga ipasabut.

AI: Karon kinahanglan namong i-install ang tanan nga mga ekstra. packages ug hawanan ang imong mga cache. Ug mahimo nimo kini ilabay dayon apt-get upgrade. Kung dili, sa matag pagtukod, bisan pa sa gitakda nga tag sa base nga imahe, lainlaing mga imahe ang makuha. Ang pag-update sa mga pakete sa imahe mao ang tahas sa tigmentinar ug giubanan sa pagbag-o sa tag.

P: Oo, gisulayan nako kini, nahimo nga ingon niini:

WORKDIR /app
COPY ./ /app

RUN 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/bundle

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

AI: Dili daotan, apan adunay usa ka butang nga buhaton. Tan-awa, ania kini nga sugo:

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*  

... wala magwagtang sa datos gikan sa katapusang hulagway, apan nagmugna lamang og dugang nga layer nga wala niini nga datos. Sakto sama niini:

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

Apan dili lang kana. Unsay naa nimo didto, Ruby? Unya dili nimo kinahanglan kopyahon ang tibuuk nga proyekto sa sinugdanan. Igo na ang pagkopya sa Gemfile ug Gemfile.lock.

Uban niini nga pamaagi, ang pag-install sa bundle dili ipatuman alang sa matag pagbag-o sa gigikanan, apan kung ang Gemfile o Gemfile.lock nausab.

Ang parehas nga mga pamaagi magamit alang sa ubang mga lengguwahe nga adunay manager sa dependency, sama sa npm, pip, kompositor ug uban pa nga gibase sa usa ka file nga adunay lista sa mga dependency.

Ug sa katapusan, hinumdomi sa sinugdanan nga naghisgot ako bahin sa ideolohiya sa Docker nga "usa ka sulud - usa ka proseso"? Kini nagpasabot nga dili kinahanglan ang usa ka superbisor. Kinahanglan usab nga dili nimo i-install ang systemd, alang sa parehas nga mga hinungdan. Sa tinuud, si Docker mismo usa ka superbisor. Ug kung mosulay ka sa pagpadagan sa daghang mga proseso niini, kini sama sa pagpadagan sa daghang mga aplikasyon sa usa ka proseso sa superbisor.
Kung magtukod, maghimo ka usa ka imahe, ug dayon ilunsad ang gikinahanglan nga gidaghanon sa mga sudlanan aron ang usa ka proseso modagan sa matag usa.

Apan labaw pa niana sa ulahi.

P: Abi nako nakasabot ko. Tan-awa unsay mahitabo:

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"]

Mahimo ba natong i-override ang paglansad sa mga daemon sa pagsugod sa sudlanan?

AI: Oo, mao kana. Pinaagi sa dalan, mahimo nimong gamiton ang CMD ug ENTRYPOINT. Ug ang paghunahuna kung unsa ang kalainan mao ang imong homework. Adunay usa ka maayo sa kini nga hilisgutan sa Habré nga artikulo.

Busa, magpadayon ta. Nag-download ka og usa ka file aron ma-install ang node, apan walay garantiya nga kini adunay sulod sa imong gikinahanglan. Kinahanglan namon nga idugang ang pag-validate. Pananglitan, sama niini:

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

Gamit ang checksum mapamatud-an nimo nga na-download nimo ang husto nga file.

P: Apan kung mausab ang file, mapakyas ang pagtukod.

AI: Oo, ug katingad-an, kini usab usa ka dugang. Mahibal-an nimo nga ang file nausab, ug imong makita kung unsa ang giusab didto. Dili nimo mahibal-an, gidugang nila, ingon, usa ka script nga nagtangtang sa tanan nga maabot niini, o nagmugna og backdoor.

P: Salamat. Kini nahimo nga ang katapusan nga Dockerfile ingon niini:

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"]

P: Igor Ivanovich, salamat sa imong tabang. Panahon na nga modagan ko, kinahanglan ko nga maghimo pa og 10 ka commit karon.

Si Igor Ivanovich, nga mihunong sa iyang nagdali nga kauban sa iyang panan-aw, miinom sa kusog nga kape. Human sa paghunahuna sa pipila ka segundo bahin sa 99.9% SLA ug bug-free code, nangutana siya og pangutana.

AI: Asa nimo ibutang ang mga troso?

P: Siyempre, sa production.log. Pinaagi sa dalan, oo, apan unsaon man namo sila pag-access nga walay ssh?

AI: Kung ibilin nimo kini sa mga file, usa ka solusyon ang naimbento na alang kanimo. Ang docker exec command nagtugot kanimo sa pagpatuman sa bisan unsang sugo sa usa ka sudlanan. Pananglitan, mahimo nimong buhaton ang iring alang sa mga troso. Ug gamit ang yawe -kini ug ang pagpadagan sa bash (kung na-install sa sudlanan) maghatag kanimo interactive nga pag-access sa sulud.

Apan dili nimo kinahanglan nga tipigan ang mga log sa mga file. Sa labing gamay, kini modala ngadto sa dili makontrol nga pagtubo sa sudlanan, ug walay usa nga nagtuyok sa mga troso. Ang tanan nga mga log kinahanglan ipadala sa stdout. Didto sila malantaw na gamit ang command mga docker log.

P: Igor Ivanovich, tingali mahimo nako ibutang ang mga troso sa usa ka naka-mount nga direktoryo, sa usa ka pisikal nga node, ingon nga datos sa tiggamit?

AI: Maayo nga wala ka makalimot sa pagtangtang sa datos nga gikarga sa disk sa node. Mahimo nimo kini sa mga troso usab, ayaw kalimti ang pag-set up sa rotation.
Mao na, makadagan ka.

P: Igor Ivanovich, mahimo ba nimo akong tambagan kung unsa ang basahon?

AI: Una, basaha rekomendasyon gikan sa mga developer sa Docker, halos walay nakaila sa Docker nga mas maayo kay kanila.

Ug kung gusto nimo makakuha usa ka internship, adto sa kusog. Human sa tanan, ang teorya nga walay praktis patay.

Source: www.habr.com

Idugang sa usa ka comment