Docker: huono neuvo

Docker: huono neuvo

Kun opiskelin ajamaan autoa, ohjaaja ajoi heti ensimmäisellä tunnilla risteykseen taaksepäin ja sanoi sitten, ettei niin saisi tehdä - ei koskaan. Muistan tämän säännön heti ja koko loppuelämäni.

Luet lapsille Grigory Osterin "Huonoja neuvoja" ja huomaat, kuinka helposti ja luonnollisesti heille selviää, ettei heidän pitäisi tehdä niin.

Docker-tiedoston kirjoittamisesta oikein on kirjoitettu paljon artikkeleita. Mutta en löytänyt ohjeita virheellisten Docker-tiedostojen kirjoittamisesta. Täytän tämän aukon. Ja ehkä niissä projekteissa, joita saan tukea, tällaisia ​​docker-tiedostoja tulee vähemmän.

Kaikki hahmot, tilanteet ja Dockerfile ovat kuvitteellisia. Jos tunnistat itsesi, anteeksi.

Docker-tiedoston luominen, pahaenteinen ja kauhea

Peter (vanhempi java/rubby/php-kehittäjä): Kollegani Vasily, oletko jo ladannut uuden moduulin Dockeriin?
Vasily (juniori): Ei, minulla ei ollut aikaa, en voi selvittää sitä tällä Dockerilla. Siitä on niin paljon artikkeleita, että se on huimaa.

Peter: Meillä oli määräaika vuosi sitten. Anna minun auttaa sinua, me selvitämme sen prosessin aikana. Kerro mikä ei sovi sinulle.

Vasily: En voi valita peruskuvaa niin, että se on minimaalinen, mutta siinä on kaikki mitä tarvitset.
Peter: Ota ubuntu-kuva, siinä on kaikki mitä tarvitset. Ja se, mikä on paljon turhaa, on hyödyllistä myöhemmin. Älä myöskään unohda laittaa uusinta tunnistetta, jotta versio on aina uusin.

Ja ensimmäinen rivi näkyy Docker-tiedostossa:

FROM ubuntu:latest

Peter: Mitä seuraavaksi, mitä käytimme moduulimme kirjoittamiseen?
Vasily: Joten ruby, siellä on web-palvelin ja pari palveludaemonia pitäisi käynnistää.
Peter: Joo, mitä me tarvitsemme: rubiinia, bundleria, nodejia, imagemagickia ja mitä muuta... Ja samalla tee päivitys saadaksesi ehdottomasti uusia paketteja.
Vasily: Ja emme luo käyttäjää, jotta emme olisi pääkäyttäjän alaisia?
Peter: Vittu, sitten sinun täytyy vielä huijata oikeuksien kanssa.
Vasily: Tarvitsen aikaa, noin 15 minuuttia, koota kaikki yhdeksi käskyksi, luin että...
(Peter keskeyttää töykeästi huolellisen ja erittäin älykkään juniorin.)
Peter: Kirjoita erillisiin komentoihin, se on helpompi lukea.

Dockerfile kasvaa:

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

Sitten Igor Ivanovich, DevOps (mutta enemmän oppeja kuin kehittäjä), ryntää toimistoon huutaen:

AI: Petya, kehittäjäsi rikkoivat jälleen ruokatietokannan, milloin tämä loppuu...

Pienen kiistan jälkeen Igor Ivanovich jäähtyy ja alkaa selvittää, mitä hänen kollegansa tekevät täällä.

AI: Mitä sinä teet?
Vasily: Peter auttaa minua luomaan Docker-tiedoston uudelle moduulille.
AI: Katson... Mitä kirjoitit tänne, puhdistat arkiston erillisellä komennolla, tämä on lisäkerros... Mutta kuinka asennat riippuvuuksia, jos et ole kopioinut Gemfileä! Ja yleisesti ottaen tämä ei ole hyvä.
Peter: Ole hyvä ja jatka yrityksesi, me selvitämme sen jotenkin.

Igor Ivanovich huokaa surullisesti ja lähtee selvittämään, kuka tietokannan rikkoi.

Peter: Kyllä, mutta hän oli oikeassa koodin suhteen, meidän täytyy työntää se kuvaan. Ja asennetaan heti ssh ja supervisor, muuten käynnistämme demonit.

Vasily: Sitten kopioin ensin Gemfile ja Gemfile.lock, asenna sitten kaikki ja sitten kopioin koko projektin. Jos Gemfile ei muutu, kerros otetaan välimuistista.
Peter: Miksi olette kaikkien näiden kerrosten kanssa, kopioi kaikki kerralla. Kopioi heti. Aivan ensimmäinen rivi.

Docker-tiedosto näyttää nyt tältä:

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: Mitä seuraavaksi? Onko sinulla asetuksia valvojalle?
Vasily: Ei, ei. Mutta teen sen nopeasti.
Peter: Sitten sinä teet sen. Piirretään nyt init-skripti, joka käynnistää kaiken. Okei, aloitat ssh:n nohupilla, jotta voimme muodostaa yhteyden säilöön ja katsoa mikä meni pieleen. Suorita sitten valvoja samalla tavalla. No, sitten vain juokse matkustaja.
K: Luin kuitenkin, että prosessin pitäisi olla yksi, joten Docker tietää, että jokin meni pieleen, ja voi käynnistää säilön uudelleen.
P: Älä vaivaa päätäsi hölynpölyillä. Ja ylipäätään, miten? Kuinka suoritat tämän kaiken yhdessä prosessissa? Anna Igor Ivanovichin ajatella vakautta, ei turhaan, että hän saa palkkaa. Meidän tehtävämme on kirjoittaa koodia. Ja ylipäänsä, anna hänen sanoa kiitos, että kirjoitimme Dockfilen hänelle.

10 minuuttia ja kaksi videota kissoista myöhemmin.

K: Olen tehnyt kaiken. Lisäsin kommentteja.
P: Näytä minulle!

Dockerfilen uusin versio:

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: Hienoa, pidän siitä. Ja kommentit ovat venäjäksi, käteviä ja luettavia, kaikki toimisivat niin. Opetin sinulle kaiken, voit tehdä loput itse. Mennään kahville...

No, nyt meillä on aivan kauhea Dockerfile, jonka näkeminen saa Igor Ivanovichin lopettamaan ja hänen silmiään sattuu vielä viikon. Dockerfile voisi tietysti olla vieläkin huonompi, täydellisyydellä ei ole rajaa. Mutta aluksi tämä riittää.

Haluaisin lopettaa lainaukseen Grigory Osterilta:

Jos et ole vielä varma
Valitsimme tien elämässä,
Etkä tiedä miksi
Aloita työmatkasi,
Rikkoa polttimot käytävillä -
Ihmiset sanovat sinulle "Kiitos".
Autat ihmisiä
Säästä sähköä.

Lähde: will.com

Lisää kommentti