Docker: malbona konsilo

Docker: malbona konsilo

Kiam mi lernis veturi aŭton, en la unua leciono la instruisto veturis en la intersekciĝon inverse, kaj tiam diris, ke vi ne faru tion - neniam. Mi rememoris ĉi tiun regulon tuj kaj dum mia tuta vivo.

Vi legas "Malbonaj Konsiloj" de Grigory Oster al infanoj, kaj vi vidas kiel facile kaj nature ekkomprenas al ili, ke ili ne faru ĉi tion.

Multaj artikoloj estis skribitaj pri kiel skribi Dockerfile ĝuste. Sed mi ne trovis instrukciojn pri kiel skribi malĝustajn Dockerfiles. Mi plenigas ĉi tiun mankon. Kaj eble en la projektoj, kiujn mi ricevas subtenon, estos malpli da tiaj dockerfiles.

Ĉiuj karakteroj, situacioj kaj Dockerfile estas fikciaj. Se vi rekonas vin, pardonu.

Kreante Dockerfile, malbonaŭgura kaj terura

Peter (Seniora java/rubby/php-programisto): Kolego Vasilij, ĉu vi jam alŝutis novan modulon al Docker?
Vasilij (juniĝa): Ne, mi ne havis tempon, mi ne povas eltrovi ĝin per ĉi tiu Docker. Estas tiom da artikoloj pri ĝi, ĝi estas kapturna.

Petro: Ni havis limdaton antaŭ jaro. Lasu min helpi vin, ni eltrovos ĝin en la procezo. Diru al mi, kio ne funkcias por vi.

Vasilij: Mi ne povas elekti bazan bildon por ke ĝi estu minimuma, sed havas ĉion, kion vi bezonas.
Peter: Prenu la ubuntu-bildon, ĝi havas ĉion, kion vi bezonas. Kaj kio estas multaj nenecesaj aferoj, estos oportunaj poste. Kaj ne forgesu meti la plej novan etikedon por ke la versio estu ĉiam la plej nova.

Kaj la unua linio aperas en la Dockerfile:

FROM ubuntu:latest

Petro: Kio sekvas, kion ni uzis por skribi nian modulon?
Vasilij: Do ruby, ekzistas retservilo kaj kelkaj servaj demonoj devus esti lanĉitaj.
Peter: Jes, kion ni bezonas: ruby, bundler, nodejs, imagemagick kaj kio alia... Kaj samtempe, faru ĝisdatigon por definitive akiri novajn pakaĵojn.
Vasilij: Kaj ni ne kreos uzanton, por ke ni ne estu sub radiko?
Petro: Fiku, tiam vi ankoraŭ devas stulti kun la rajtoj.
Vasilij: Mi bezonas tempon, ĉirkaŭ 15 minutojn, por kunmeti ĉion en unu ordonon, mi legis tion...
(Petro malĝentile interrompas la zorgeman kaj tre saĝan junulon.)
Petro: Skribu en apartaj ordonoj, estos pli facile legebla.

Dockerfile kreskas:

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

Tiam Igor Ivanoviĉ, DevOps (sed pli da Ops ol Dev), eksplodas en la oficejon kriante:

AI: Petya, viaj programistoj denove rompis la manĝdatumbazon, kiam tio finos...

Post eta bataleto, Igor Ivanoviĉ malvarmiĝas kaj komencas ekscii, kion faras liaj kolegoj ĉi tie.

AI: Kion vi faras?
Vasilij: Petro helpas min krei Dockerfile por nova modulo.
AI: Mi rigardu... Kion vi skribis ĉi tie, vi purigas la deponejon per aparta komando, ĉi tio estas plia tavolo... Sed kiel instali dependecojn se vi ne kopiis la Gemdosiero! Kaj ĝenerale, ĉi tio ne estas bona.
Petro: Bonvolu fari vian aferon, ni iel eltrovos.

Igor Ivanoviĉ ĝemas malgaje kaj foriras por ekscii, kiu rompis la datumbazon.

Petro: Jes, sed li pravis pri la kodo, ni devas puŝi ĝin en la bildon. Kaj ni tuj instalu ssh kaj kontroliston, alie ni komencos la demonojn.

Vasilij: Tiam mi unue kopios la Gemfile kaj Gemfile.lock, poste mi instalos ĉion, kaj poste mi kopios la tutan projekton. Se la Gemfile ne ŝanĝiĝas, la tavolo estos prenita el la kaŝmemoro.
Petro: Kial vi ĉiuj estas kun ĉi tiuj tavoloj, kopiu ĉion samtempe. Kopiu tuj. La unua linio.

La Dockerfile nun aspektas jene:

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

Petro: Do, kio poste? Ĉu vi havas agordojn por kontrolisto?
Vasilij: Ne, ne. Sed mi faros ĝin rapide.
Petro: Tiam vi faros ĝin. Ni nun skizu init-skripton, kiu lanĉos ĉion. Bone, do vi komencu ssh, per nohup, por ke ni povu konekti al la ujo kaj vidi kio misfunkciis. Tiam kuru kontroliston en la sama maniero. Nu, tiam vi nur kuras pasaĝeron.
Q: Sed mi legis, ke devus ekzisti unu procezo, do Docker scios, ke io misfunkciis kaj povas rekomenci la ujon.
P: Ne ĝenu vian kapon per sensencaĵo. Kaj ĝenerale, kiel? Kiel vi kuras ĉion ĉi en unu procezo? Lasu Igor Ivanovich pensi pri stabileco, ne vane li ricevas salajron. Nia tasko estas skribi kodon. Kaj ĝenerale, li diru dankon, ke ni skribis la Dockefile por li.

10 minutojn kaj du filmetojn pri katoj poste.

D: Mi faris ĉion. Mi aldonis pliajn komentojn.
P: Montru al mi!

Plej nova versio 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: Bonege, mi ŝatas ĝin. Kaj la komentoj estas en la rusa, oportunaj kaj legeblaj, ĉiuj laborus tiel. Mi instruis al vi ĉion, la reston vi mem povas fari. Ni iru preni iom da kafo...

Nu, nun ni havas tute teruran Dockerfile, kies vido igos Igor Ivanoviĉ deziri forlasi kaj liaj okuloj doloros ankoraŭ unu semajnon. La Dockerfile, kompreneble, povus esti eĉ pli malbona, ne estas limo al perfekteco. Sed por komenci, ĉi tio faros.

Mi ŝatus fini per citaĵo de Grigory Oster:

Se vi ankoraŭ ne certas
Ni elektis la vojon en la vivo,
Kaj vi ne scias kial
Komencu vian laborvojaĝon,
Rompu la ampolojn en la koridoroj -
Homoj diros "Dankon" al vi.
Vi helpos la homojn
Ŝparu elektron.

fonto: www.habr.com

Aldoni komenton