Docker: henteu naséhat goréng

Dina komentar kana artikel abdi Docker: nasihat goréng aya seueur pamundut pikeun ngajelaskeun naha Dockerfile anu dijelaskeun dina éta pikasieuneun.

Ringkesan episode saméméhna: Dua pamekar nyusun Dockerfile dina wates waktu anu ketat. Dina prosés, Ops Igor Ivanovich datang ka aranjeunna. Hasilna Dockerfile parah pisan sahingga AI aya dina ambang serangan jantung.

Docker: henteu naséhat goréng

Ayeuna hayu urang terang naon anu salah dina Dockerfile ieu.

Ku kituna, saminggu geus kaliwat.

Dev Petya meets Ops Igor Ivanovich di kamar makan ngaliwatan cangkir kopi.

P: Igor Ivanovich, anjeun sibuk pisan? Abdi hoyong terang dimana urang ngaco.

AI: Éta saé, anjeun henteu sering pendak sareng pamekar anu resep kana eksploitasi.
Kahiji, hayu urang satuju kana sababaraha hal:

  1. Idéologi Docker: hiji wadah - hiji prosés.
  2. Beuki leutik wadahna, langkung saé.
  3. Beuki Anjeun nyandak tina cache, nu hadé.

P: Naha kudu aya hiji prosés dina hiji wadah?

AI: Docker, nalika ngamimitian wadahna, ngawas kaayaan prosés kalayan pid 1. Lamun prosésna maot, Docker nyobian ngabalikan deui wadahna. Hayu urang nyebutkeun anjeun boga sababaraha aplikasi ngajalankeun dina wadahna, atawa aplikasi utama teu ngajalankeun kalawan pid 1. Lamun prosés maot, Docker moal nyaho ngeunaan eta.

Upami anjeun teu gaduh patarosan langkung seueur, punten nunjukkeun kami Dockerfile anjeun.

Sareng Petya nunjukkeun:

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, hayu urang nyandak eta dina urutan. Hayu urang mimitian ku baris kahiji:

FROM ubuntu:latest

Anjeun nyandak tag latest. Ngagunakeun tag latest ngakibatkeun konsékuansi unpredictable. Bayangkeun, pangropéa gambar ngawangun versi énggal tina gambar kalayan daptar parangkat lunak anu béda, gambar ieu nampi tag anu pang anyarna. Sareng wadahna anjeun, paling saé, lirén ngawangun, sareng anu paling parah, anjeun nyekel bug anu teu aya sateuacanna.

Anjeun nyandak gambar sareng OS anu lengkep sareng seueur parangkat lunak anu teu dipikabutuh, anu ngagedekeun volume wadahna. Jeung software beuki loba liang sarta vulnerabilities.

Salaku tambahan, gambar anu langkung ageung, langkung seueur rohangan anu diperyogikeun dina host sareng dina pendaptaran (naha anjeun nyimpen gambar dimana waé)?

P: Leres, tangtosna, urang gaduh pendaptaran, anjeun nyetél éta.

AI: Janten, naon anu kuring nyarioskeun?.. Oh enya, jilidna... Beban dina jaringan ogé ningkat. Pikeun gambar tunggal ieu teu noticeable, tapi lamun aya hiji ngawangun kontinyu, tés jeung deployment, éta noticeable. Sareng upami anjeun henteu gaduh mode Allah dina AWS, anjeun ogé bakal nampi tagihan kosmik.

Ku alatan éta, anjeun kedah milih gambar anu paling cocog, kalayan versi pasti sareng parangkat lunak minimum. Contona, nyandak: FROM ruby:2.5.5-stretch

P: Oh, abdi ningali. Kumaha sareng dimana kuring tiasa ningali gambar anu sayogi? Kumaha kuring terang mana anu kuring peryogikeun?

AI: Biasana gambar dicokot tina dockerhub, ulah bingung jeung pornhub :). Biasana aya sababaraha rakitan pikeun gambar:
alpine: gambar dikumpulkeun dina gambar Linux Ubuntu minimalistic, ngan 5 MB. disadvantage na: ieu disusun kalawan palaksanaan libc sorangan, bungkusan baku teu dianggo di dinya. Manggihan tur masang pakét diperlukeun bakal butuh loba waktu.
ngagaro: gambar dasar, teu dipaké pikeun ngawangun gambar séjén. Ieu dimaksudkeun solely pikeun ngajalankeun binér, data disusun. Cocog pikeun ngajalankeun aplikasi binér anu kalebet sadayana anu anjeun peryogikeun, sapertos aplikasi GO.
Dumasar kana OS naon waé, sapertos Ubuntu atanapi Debian. Nya, kuring henteu nyangka aya anu peryogi ngajelaskeun.

AI: Ayeuna urang kedah masang sadaya tambahan. pakét sareng mupus cache anjeun. Sareng anjeun tiasa ngalungkeun éta langsung pamutahiran apt-meunang. Upami teu kitu, kalawan unggal ngawangun, sanajan tag tetep tina gambar dasar, gambar béda bakal diala. Ngamutahirkeun bungkusan dina gambar mangrupikeun tugas pangurus sareng dibarengan ku ngarobih tag.

P : Leres, abdi nyobian ngalakukeunana, ternyata sapertos kieu:

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: Henteu goréng, tapi aya ogé anu badé dianggo. Tingali, ieu paréntah ieu:

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

... henteu ngahapus data tina gambar ahir, tapi ngan ukur nyiptakeun lapisan tambahan tanpa data ieu. Leres sapertos kieu:

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

Tapi éta henteu sadayana. Naon anu anjeun gaduh di dinya, Ruby? Lajeng anjeun teu kudu nyalin sakabéh proyék di awal. Ieu cukup pikeun nyalin Gemfile na Gemfile.lock.

Kalawan pendekatan ieu, kebat install moal dieksekusi pikeun unggal robah sumber, tapi ngan lamun Gemfile atanapi Gemfile.lock geus robah.

Métode anu sami tiasa dianggo pikeun basa sanés sareng manajer kagumantungan, sapertos npm, pip, komposer sareng anu sanésna dumasar kana file anu aya daptar katergantungan.

Sareng pamustunganana, émut dina awal kuring nyarioskeun ideologi Docker "hiji wadah - hiji prosés"? Ieu ngandung harti yén pengawas teu diperlukeun. Anjeun oge kedah teu install systemd, alesan sarua. Intina, Docker sorangan mangrupikeun pengawas. Sareng nalika anjeun nyobian ngajalankeun sababaraha prosés di jerona, éta sapertos ngajalankeun sababaraha aplikasi dina hiji prosés pengawas.
Nalika ngawangun, anjeun bakal nyieun gambar tunggal, lajeng ngajalankeun jumlah diperlukeun tina wadahna ku kituna hiji prosés dijalankeun dina unggal.

Tapi langkung seueur ngeunaan éta engké.

P: Sigana abdi ngartos. Tingali naon anu lumangsung:

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

Naha urang tiasa nimpa peluncuran daemon nalika ngamimitian wadahna?

AI: Leres, leres. Ku jalan kitu, anjeun tiasa nganggo CMD sareng ENTRYPOINT. Jeung figuring kaluar naon bédana nyaeta PR Anjeun. Aya anu saé dina topik ieu ngeunaan Habré artikel.

Janten, hayu urang teraskeun. Anjeun unduh file pikeun masang node, tapi teu aya jaminan yén éta bakal ngandung naon anu anjeun peryogikeun. Urang kedah nambihan validasi. Contona, saperti kieu:

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

Nganggo checksum anjeun tiasa pariksa yén anjeun unduh file anu leres.

P: Tapi lamun file robah, ngawangun bakal gagal.

AI: Leres, sareng cukup aneh, ieu ogé tambah. Anjeun bakal terang yén file parantos robih, sareng anjeun tiasa ningali naon anu dirobih di dinya. Anjeun pernah nyaho, aranjeunna ditambahkeun, sebutkeun, naskah nu mupus sagalana bisa ngahontal, atawa nyieun backdoor a.

P: Hatur nuhun. Tétéla yén Dockerfile final bakal sapertos kieu:

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, hatur nuhun pikeun pitulung anjeun. Waktosna pikeun kuring ngajalankeun, kuring kedah ngadamel 10 langkung komitmen ayeuna.

Igor Ivanovich, eureun batur sapagawean rusuh-Na jeung gaze-Na, nyokot sip kopi kuat. Saatos mikir sababaraha detik ngeunaan 99.9% SLA sareng kode bug-gratis, anjeunna naroskeun patarosan.

AI: Dimana anjeun nyimpen log?

P: Tangtu, dina production.log. Ku jalan kitu, enya, tapi kumaha urang tiasa ngaksés aranjeunna tanpa ssh?

AI: Upami anjeun ngantepkeunana dina file, solusina parantos diciptakeun pikeun anjeun. Paréntah docker exec ngamungkinkeun anjeun ngaéksekusi paréntah naon waé dina wadah. Salaku conto, anjeun tiasa ngalakukeun ucing pikeun log. Sareng nganggo konci -ieu sarta ngajalankeun bash (lamun dipasang dina wadahna) bakal mere Anjeun wasa interaktif kana wadahna.

Tapi anjeun teu kedah nyimpen log dina file. Sahenteuna, ieu ngakibatkeun tumuwuhna uncontrolled wadahna, sarta teu saurang ogé rotates log. Sadaya log kedah dikirim ka stdout. Aya aranjeunna parantos tiasa ditingali nganggo paréntah log docker.

P: Igor Ivanovich, meureun kuring tiasa nempatkeun log dina diréktori anu dipasang, dina titik fisik, salaku data pangguna?

AI: Éta saé yén anjeun henteu hilap ngahapus data anu dimuat kana disk node. Anjeun tiasa ngalakukeun ieu sareng log ogé, ngan ulah hilap nyetél rotasi.
Éta éta, anjeun tiasa ngajalankeun.

P: Igor Ivanovich, anjeun tiasa mamatahan kuring naon maca?

AI: Baca heula rekomendasi ti pamekar Docker, boro saha weruh Docker hadé ti aranjeunna.

Sareng upami anjeun hoyong magang, angkat ka intensip. Barina ogé, téori tanpa prakték maot.

sumber: www.habr.com

Tambahkeun komentar