Docker: mal consell

Docker: mal consell

Quan estava aprenent a conduir un cotxe, a la primera lliçó l'instructor va conduir a la intersecció al revés i després va dir que no hauries de fer això, mai. Vaig recordar aquesta regla immediatament i per a la resta de la meva vida.

Llegiu "Bad Advice" de Grigory Oster als nens, i veieu amb quina facilitat i naturalitat se'ls adona que no haurien de fer això.

S'han escrit molts articles sobre com escriure un Dockerfile correctament. Però no vaig trobar instruccions sobre com escriure Dockerfiles incorrectes. Estic omplint aquest buit. I potser en els projectes que rebo suport, hi haurà menys fitxers dockerfiles.

Tots els personatges, situacions i Dockerfile són ficticis. Si et reconeixes, ho sento.

Creant un Dockerfile, ominós i terrible

Peter (desenvolupador java/rubby/php sènior): company Vasily, ja heu penjat un mòdul nou a Docker?
Vasily (junior): No, no vaig tenir temps, no ho puc esbrinar amb aquest Docker. Hi ha tants articles sobre això, és vertiginós.

Peter: Fa un any teníem una data límit. Deixa'm ajudar-te, ho descobrirem en el procés. Digues-me què no et funciona.

Vasily: No puc triar una imatge bàsica perquè sigui mínima, però té tot el que necessites.
Peter: Pren la imatge d'ubuntu, té tot el que necessites. I el que són moltes coses innecessàries seran útils més endavant. I no us oblideu de posar l'etiqueta més recent perquè la versió sigui sempre l'última.

I la primera línia apareix al Dockerfile:

FROM ubuntu:latest

Peter: Què passa, què hem utilitzat per escriure el nostre mòdul?
Vasily: Així que Ruby, hi ha un servidor web i s'haurien de llançar un parell de dimonis de servei.
Peter: Sí, què necessitem: ruby, bundler, nodejs, imagemagick i què més... I al mateix temps, fer una actualització per obtenir nous paquets definitivament.
Vasily: I no crearem un usuari perquè no estiguem sota root?
Peter: Fot-ho, llavors encara t'has de jugar amb els drets.
Vasily: Necessito temps, uns 15 minuts, per ajuntar-ho tot en una ordre, he llegit això...
(En Peter interromp rudament el jove meticulós i molt intel·ligent.)
Pere: Escriu en ordres separades, serà més fàcil de llegir.

Dockerfile creix:

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

Aleshores Igor Ivanovich, DevOps (però més Ops que Dev), irromp a l'oficina cridant:

AI: Petya, els teus desenvolupadors van tornar a trencar la base de dades d'aliments, quan acabarà això...

Després d'una petita escaramuza, Igor Ivanovich es refreda i comença a esbrinar què estan fent els seus companys aquí.

AI: Què estàs fent?
Vasily: Peter m'està ajudant a crear un Dockerfile per a un mòdul nou.
AI: Deixeu-me fer un cop d'ull... Què heu escrit aquí, netegeu el dipòsit amb una ordre independent, aquesta és una capa addicional... Però com instal·leu dependències si no heu copiat el Gemfile! I, en general, això no és bo.
Peter: Si us plau, fes el teu negoci, ho descobrirem d'alguna manera.

Igor Ivanovich sospira amb tristesa i marxa per esbrinar qui va trencar la base de dades.

Peter: Sí, però tenia raó sobre el codi, hem d'introduir-lo a la imatge. I instal·lem immediatament ssh i supervisor, en cas contrari començarem els dimonis.

Vasily: Aleshores, primer copiaré el Gemfile i el Gemfile.lock, després ho instal·laré tot i després copiaré tot el projecte. Si el fitxer Gemfile no canvia, la capa s'eliminarà de la memòria cau.
Pere: Per què esteu tots amb aquestes capes, copieu-ho tot alhora. Copia immediatament. La primera línia.

El Dockerfile ara té aquest aspecte:

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

Pere: Aleshores, què després? Tens configuracions per al supervisor?
Vasily: No, no. Però ho faré ràpidament.
Pere: Aleshores ho faràs. Ara dibuixem un script d'inici que ho iniciarà tot. D'acord, comenceu ssh, amb nohup, perquè puguem connectar-nos al contenidor i veure què ha fallat. A continuació, executeu el supervisor de la mateixa manera. Bé, aleshores només feu un passatger.
P: Però he llegit que hi hauria d'haver un procés, de manera que Docker sabrà que alguna cosa ha fallat i pot reiniciar el contenidor.
P: No et molestis el cap amb tonteries. I en general, com? Com s'executa tot això en un sol procés? Deixeu que Igor Ivanovich pensi en l'estabilitat, no és en va que rep un sou. La nostra feina és escriure codi. I, en general, que digui les gràcies per haver escrit el Dockefile per a ell.

10 minuts i dos vídeos sobre gats més tard.

P: Ho he fet de tot. He afegit més comentaris.
P: Mostra'm!

Última versió de 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: Genial, m'agrada. I els comentaris estan en rus, còmodes i llegibles, tothom treballaria així. T'ho vaig ensenyar tot, tu pots fer la resta. Anem a prendre un cafè...

Bé, ara tenim un Dockerfile perfectament terrible, la visió del qual farà que Igor Ivanovich vulgui renunciar i els ulls li faran mal una setmana més. El Dockerfile, per descomptat, podria ser encara pitjor, no hi ha límit a la perfecció. Però per començar, això servirà.

M'agradaria acabar amb una cita de Grigory Oster:

Si encara no n'estàs segur
Hem escollit el camí de la vida,
I no saps per què
Comença el teu viatge laboral,
Trenqueu les bombetes als passadissos -
La gent et dirà "gràcies".
Ajudaràs a la gent
Estalvia electricitat.

Font: www.habr.com

Afegeix comentari