Docker: slegte raad

Docker: slegte raad

Toe ek leer motor bestuur het, het die instrukteur met die heel eerste les in trurat by die kruising ingery, en toe gesê jy moet dit nie doen nie – glad nie. Ek het hierdie reël onmiddellik en vir die res van my lewe onthou.

Jy lees “Slegte raad” van Grigory Oster vir kinders, en jy sien hoe maklik en natuurlik dit tot hulle deurdring dat hulle dit nie moet doen nie.

Baie artikels is geskryf oor hoe om 'n Dockerfile korrek te skryf. Maar ek het nie instruksies teëgekom oor hoe om verkeerde Dockerfiles te skryf nie. Ek vul hierdie gaping. En dalk in die projekte wat ek ondersteuning ontvang, sal daar minder sulke dockerfiles wees.

Alle karakters, situasies en Dockerfile is fiktief. As jy jouself herken, jammer.

Skep 'n Dockerfile, onheilspellend en verskriklik

Peter (Senior java/rubby/php-ontwikkelaar): Kollega Vasily, het jy al 'n nuwe module na Docker opgelaai?
Vasily (junior): Nee, ek het nie tyd gehad nie, ek kan dit nie uitvind met hierdie Docker nie. Daar is soveel artikels daaroor, dit is duiselingwekkend.

Peter: Ons het 'n jaar gelede 'n sperdatum gehad. Laat ek jou help, ons sal dit in die proses uitvind. Vertel my wat nie vir jou werk nie.

Vasily: Ek kan nie 'n basiese beeld kies sodat dit minimaal is nie, maar het alles wat jy nodig het.
Peter: Neem die ubuntu-beeld, dit het alles wat jy nodig het. En wat baie onnodige goed is, sal later handig te pas kom. En moenie vergeet om die nuutste etiket te plaas sodat die weergawe altyd die nuutste is nie.

En die eerste reël verskyn in die Dockerfile:

FROM ubuntu:latest

Peter: Wat is volgende, wat het ons gebruik om ons module te skryf?
Vasily: So ruby, daar is 'n webbediener en 'n paar diensdemone moet bekendgestel word.
Peter: Ja, wat het ons nodig: ruby, bundler, nodejs, imagemagick en wat nog... En doen terselfdertyd 'n opgradering om beslis nuwe pakkette te kry.
Vasily: En ons sal nie 'n gebruiker skep sodat ons nie onder wortel sal wees nie?
Peter: Fok dit, dan moet jy nog flous met die regte.
Vasily: Ek het tyd nodig, ongeveer 15 minute, om dit alles saam te voeg in een opdrag, ek het gelees dat ...
(Peter val die noukeurige en baie slim junior onbeskof in die rede.)
Petrus: Skryf in aparte opdragte, dit sal makliker wees om te lees.

Dockerfile groei:

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

Dan bars Igor Ivanovich, DevOps (maar meer Ops as Dev), die kantoor binne en skree:

AI: Petya, jou ontwikkelaars het weer die voedseldatabasis gebreek, wanneer sal dit eindig ...

Na 'n klein skermutseling koel Igor Ivanovich af en begin uitvind wat sy kollegas hier doen.

AI: Wat doen jy?
Vasily: Peter help my om 'n Dockerfile vir 'n nuwe module te skep.
AI: Kom ek kyk... Wat het jy hier geskryf, jy maak die repository skoon met 'n aparte opdrag, dit is 'n addisionele laag... Maar hoe installeer jy afhanklikhede as jy nie die Gemfile gekopieer het nie! En in die algemeen is dit nie goed nie.
Peter: Gaan asseblief oor jou besigheid, ons sal dit op een of ander manier uitvind.

Igor Ivanovich sug hartseer en vertrek om uit te vind wie die databasis gebreek het.

Peter: Ja, maar hy was reg oor die kode, ons moet dit in die beeld druk. En kom ons installeer dadelik ssh en supervisor, anders begin ons die daemone.

Vasily: Dan sal ek eers die Gemfile en Gemfile.lock kopieer, dan sal ek alles installeer, en dan sal ek die hele projek kopieer. As die Gemfile nie verander nie, sal die laag uit die kas geneem word.
Peter: Hoekom is julle almal met hierdie lae, kopieer alles op een slag. Kopieer dadelik. Die heel eerste reël.

Die Dockerfile lyk nou so:

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, wat volgende? Het jy konfigurasies vir toesighouer?
Vasily: Nee, nee. Maar ek sal dit vinnig doen.
Petrus: Dan sal jy dit doen. Kom ons skets nou 'n init script wat alles sal begin. Goed, so jy begin ssh, met nohup, sodat ons aan die houer kan koppel en sien wat verkeerd geloop het. Begin dan toesighouer op dieselfde manier. Wel, dan hardloop jy net passasier.
V: Maar ek lees dat daar een proses moet wees, so Docker sal weet dat iets verkeerd geloop het en die houer kan herbegin.
P: Moenie jou kop steur aan nonsens nie. En in die algemeen, hoe? Hoe voer jy dit alles in een proses uit? Laat Igor Ivanovich oor stabiliteit dink, dit is nie verniet dat hy 'n salaris ontvang nie. Ons werk is om kode te skryf. En in die algemeen, laat hom dankie sê dat ons die Dokfile vir hom geskryf het.

10 minute en twee video's oor katte later.

V: Ek het alles gedoen. Ek het meer opmerkings bygevoeg.
P: Wys my!

Jongste weergawe van 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: Wonderlik, ek hou daarvan. En die kommentaar is in Russies, gerieflik en leesbaar, almal sal so werk. Ek het jou alles geleer, die res kan jy self doen. Kom ons gaan drink koffie...

Wel, nou het ons 'n heeltemal verskriklike Dockerfile, waarvan die aansig Igor Ivanovich sal laat wil ophou en sy oë sal nog 'n week seermaak. Die Dockerfile kan natuurlik selfs erger wees, daar is geen beperking op perfeksie nie. Maar vir 'n begin sal dit deug.

Ek wil afsluit met 'n aanhaling van Grigory Oster:

As jy nog nie seker is nie
Ons het die pad in die lewe gekies,
En jy weet nie hoekom nie
Begin jou arbeidsreis,
Breek die gloeilampe in die gange -
Mense sal vir jou sê "Dankie".
Jy sal die mense help
Spaar elektrisiteit.

Bron: will.com

Voeg 'n opmerking