Docker: ora saran ala

Ing komentar ing artikelku Docker: saran ala ana akeh panjalukan kanggo nerangake apa Dockerfile diterangake ing iku dadi elek.

Ringkesan saka episode sadurungé: Loro pangembang nyipta Dockerfile ing tenggat wektu sing ketat. Ing proses kasebut, Ops Igor Ivanovich teka. Dockerfile sing diasilake ala banget yen AI ana ing ambang serangan jantung.

Docker: ora saran ala

Saiki ayo ngerteni apa sing salah karo Dockerfile iki.

Dadi, seminggu wis liwati.

Dev Petya ketemu karo Ops Igor Ivanovich ing ruang makan kanthi nyruput kopi.

P: Igor Ivanovich, sampeyan sibuk banget? Aku kaya kanggo tokoh metu ngendi kita ngaco munggah.

AI: Iku apik, sampeyan ora kerep ketemu developer sing kasengsem ing eksploitasi.
Pisanan, ayo setuju babagan sawetara perkara:

  1. Ideologi Docker: siji wadhah - siji proses.
  2. Sing cilik wadhah, luwih apik.
  3. Sing luwih sampeyan njupuk saka cache, luwih apik.

P : Kenging punapa kedah wonten proses satunggal wadhah?

AI: Docker, nalika miwiti wadhah, ngawasi kahanan proses kanthi pid 1. Yen proses mati, Docker nyoba miwiti maneh wadhah kasebut. Ayo dadi ngomong sampeyan duwe sawetara aplikasi mlaku ing wadhah, utawa aplikasi utama ora mlaku karo pid 1. Yen proses mati, Docker ora bakal ngerti.

Yen sampeyan ora duwe pitakon liyane, tuduhake Dockerfile sampeyan.

Lan Petya nuduhake:

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: Oh, ayo diurutake. Ayo dadi miwiti karo baris pisanan:

FROM ubuntu:latest

Sampeyan njupuk tag latest. Nggunakake tag latest ndadékaké kanggo jalaran ranyono. Mbayangno, maintainer gambar mbangun versi anyar saka gambar karo dhaftar lunak beda, gambar iki nampa tag paling anyar. Lan wadhah sampeyan, paling apik, mandheg mbangun, lan sing paling awon, sampeyan nyekel kewan omo sing durung ana sadurunge.

Sampeyan njupuk gambar kanthi OS lengkap kanthi akeh piranti lunak sing ora perlu, sing nambah volume wadhah. Lan liyane lunak, liyane bolongan lan vulnerabilities.

Kajaba iku, gambar sing luwih gedhe, luwih akeh papan sing dibutuhake ing host lan ing registri (apa sampeyan nyimpen gambar ing endi wae)?

P : Ya, mesthi, kita duwe registri, sampeyan nyetel.

AI: Lho, aku ngomong apa?.. Oh ya, volume. Kanggo gambar siji iki ora katon, nanging nalika ana terus mbangun, tes lan penyebaran prajurit, iku katon. Lan yen sampeyan ora duwe mode Gusti Allah ing AWS, sampeyan uga bakal entuk tagihan kosmik.

Mulane, sampeyan kudu milih gambar sing paling cocok, kanthi versi pas lan piranti lunak minimal. Contone, njupuk: FROM ruby:2.5.5-stretch

P: Oh, aku weruh. Kepiye lan ing ngendi aku bisa ndeleng gambar sing kasedhiya? Carane aku ngerti kang siji aku kudu?

AI: Biasane gambar dijupuk saka dockerhub, ojo bingung karo pornhub :). Biasane ana sawetara rakitan kanggo gambar:
Alpine: gambar diklumpukake ing gambar Linux minimalis, mung 5 MB. Kerugian: dikompilasi karo implementasi libc dhewe, paket standar ora bisa digunakake. Nemokake lan nginstal paket sing dibutuhake bakal mbutuhake wektu akeh.
Scratch: gambar dhasar, ora digunakake kanggo mbangun gambar liyane. Iki dimaksudake mung kanggo mbukak binar, data sing disiapake. Cocog kanggo mbukak aplikasi binar sing kalebu kabeh sing dibutuhake, kayata aplikasi GO.
Adhedhasar OS apa wae, kayata Ubuntu utawa Debian. Inggih, aku ora mikir ana perlu kanggo nerangake.

AI: Saiki kita kudu nginstal kabeh tambahan. paket lan mbusak caches. Lan sampeyan bisa mbuwang langsung apt-get upgrade. Yen ora, kanthi saben mbangun, sanajan tag tetep saka gambar dhasar, gambar sing beda bakal dipikolehi. Nganyari paket ing gambar minangka tugas saka maintainer lan diiringi ngganti tag.

P : Ya wis tak coba, ternyata kaya kiye :

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: Ora ala, nanging ana sing kudu digarap. Delengen, prentah iki:

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

... ora mbusak data saka gambar pungkasan, nanging mung nggawe lapisan tambahan tanpa data iki. Bener kaya iki:

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

Nanging ora mung kuwi. Apa sing sampeyan duwe, Ruby? Banjur sampeyan ora kudu nyalin kabeh proyek ing wiwitan. Iku cukup kanggo nyalin Gemfile lan Gemfile.lock.

Kanthi pendekatan iki, mbendel nginstal ora bakal kaleksanan kanggo saben owah-owahan sumber, nanging mung yen Gemfile utawa Gemfile.lock wis diganti.

Cara sing padha bisa digunakake kanggo basa liya kanthi manajer dependensi, kayata npm, pip, komposer lan liya-liyane adhedhasar file kanthi dhaptar dependensi.

Lan pungkasane, elinga ing wiwitan aku ngomong babagan ideologi Docker "siji wadhah - siji proses"? Iki tegese pengawas ora dibutuhake. Sampeyan uga kudu ora nginstal systemd, kanthi alasan sing padha. Intine, Docker dhewe minangka pengawas. Lan nalika sampeyan nyoba kanggo mbukak macem-macem pangolahan ing, iku kaya mbukak macem-macem aplikasi ing siji proses supervisor.
Nalika mbangun, sampeyan bakal nggawe gambar siji, lan banjur miwiti jumlah sing dibutuhake saka kontaner supaya siji proses mlaku ing saben.

Nanging luwih ing mengko.

P : Kula ngertos. Delengen apa sing kedadeyan:

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

Apa kita bisa ngatasi peluncuran daemon nalika miwiti wadhah kasebut?

AI: Ya bener. Miturut cara, sampeyan bisa nggunakake CMD lan ENTRYPOINT. Lan ngerteni apa bedane yaiku peer sampeyan. Ana sing apik babagan topik iki ing Habré artikel.

Dadi, ayo nerusake. Sampeyan ndownload file kanggo nginstal node, nanging ora ana jaminan manawa bakal ngemot apa sing dibutuhake. Kita kudu nambah validasi. Contone, kaya iki:

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

Nggunakake checksum sampeyan bisa verifikasi manawa sampeyan wis ndownload file sing bener.

P: Nanging yen file diganti, mbangun bakal gagal.

AI: Ya, lan anehe, iki uga plus. Sampeyan bakal ngerti sing file wis diganti, lan sampeyan bakal bisa ndeleng apa sing diganti ana. Sampeyan ora ngerti, padha nambah, ngomong, script sing mbusak kabeh bisa tekan, utawa nggawe backdoor.

P : Matur nuwun. Pranyata Dockerfile pungkasan bakal katon kaya iki:

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, matur nuwun kanggo bantuan sampeyan. Wektu kanggo aku mlaku, aku kudu nggawe 10 komitmen liyane dina iki.

Igor Ivanovich, nolak rowange cepet-cepet karo ndeleng, njupuk SIP saka warung kuwat. Sawise mikir sawetara detik babagan 99.9% SLA lan kode bug-free, takon pitakonan.

AI: Ing endi sampeyan nyimpen log?

P: Mesthi, ing production.log. Ngomong-ngomong, ya, nanging kepiye carane bisa ngakses tanpa ssh?

AI: Yen sampeyan ninggalake file kasebut, solusi wis diciptakake kanggo sampeyan. Perintah docker exec ngidini sampeyan nglakokake perintah apa wae ing wadhah. Contone, sampeyan bisa nindakake cat kanggo log. Lan nggunakake tombol -t lan mlaku bash (yen diinstal ing wadhah) bakal menehi akses interaktif kanggo wadhah.

Nanging sampeyan ora kudu nyimpen log ing file. Paling ora, iki nyebabake wutah wadhah sing ora bisa dikendhaleni, lan ora ana sing muter log. Kabeh log kudu dikirim menyang stdout. Ing kana, dheweke wis bisa dideleng nggunakake perintah kasebut log docker.

P: Igor Ivanovich, mungkin aku bisa nyelehake log ing direktori sing dipasang, ing simpul fisik, minangka data pangguna?

AI: Iku apik yen sampeyan ora lali mbusak data sing dimuat menyang disk simpul. Sampeyan uga bisa nindakake iki karo log, mung aja lali nyetel rotasi.
Iku, sampeyan bisa mlaku.

P: Igor Ivanovich, sampeyan bisa menehi saran apa sing kudu diwaca?

AI: Pisanan, maca Rekomendasi saka pangembang Docker, meh ora ana sing ngerti Docker luwih apik tinimbang dheweke.

Lan yen sampeyan pengin njaluk internship, pindhah menyang tenanan. Sawise kabeh, teori tanpa praktik iku mati.

Source: www.habr.com

Add a comment