Docker: kötü tavsiye

Docker: kötü tavsiye

Araba kullanmayı öğrenirken, ilk derste eğitmen kavşağa ters yönde sürdü ve sonra bunu yapmamanız gerektiğini söyledi - asla. Bu kuralı hemen ve hayatımın geri kalanında hatırladım.

Çocuklara Grigory Oster'ın "Kötü Öğütler" kitabını okuyorsunuz ve bunu yapmamaları gerektiğinin ne kadar kolay ve doğal bir şekilde akıllarına geldiğini görüyorsunuz.

Dockerfile'ın doğru şekilde nasıl yazılacağına dair birçok makale yazıldı. Ancak yanlış Docker dosyalarının nasıl yazılacağına dair talimatlara rastlamadım. Bu boşluğu dolduruyorum. Ve belki de destek aldığım projelerde bu tür dockerfiles daha az olacaktır.

Tüm karakterler, durumlar ve Dockerfile kurgusaldır. Kendini tanıdıysan özür dilerim.

Uğursuz ve korkunç bir Dockerfile oluşturmak

Peter (Kıdemli java/rubby/php geliştiricisi): Meslektaşım Vasily, Docker'a yeni bir modül yükledin mi?
Vasily (junior): Hayır, zamanım olmadı, bu Docker'la çözemiyorum. Hakkında o kadar çok makale var ki, baş döndürücü.

Peter: Bir yıl önce son teslim tarihimiz vardı. İzin ver sana yardım edeyim, bunu süreçte çözeceğiz. Senin için neyin işe yaramadığını söyle bana.

Vasily: Minimal olsun diye temel bir görsel seçemiyorum ama ihtiyacınız olan her şeye sahip.
Peter: Ubuntu görselini alın, ihtiyacınız olan her şey onda var. Ve pek çok gereksiz şey daha sonra işe yarayacak. Sürümün her zaman en yeni olması için en son etiketi koymayı unutmayın.

Ve Dockerfile'da ilk satır beliriyor:

FROM ubuntu:latest

Peter: Sırada ne var, modülümüzü yazmak için ne kullandık?
Vasily: Yani Ruby, bir web sunucusu var ve birkaç hizmet programının başlatılması gerekiyor.
Peter: Evet, neye ihtiyacımız var: ruby, bundler, nodejs, imagemagick ve başka ne... Ve aynı zamanda kesinlikle yeni paketler almak için yükseltme yapın.
Vasily: Peki root altında kalmamak için bir kullanıcı oluşturmayacağız öyle mi?
Peter: Siktir et, o zaman hâlâ haklarla oyalanmak zorundasın.
Vasily: Hepsini tek bir komutta bir araya getirmek için yaklaşık 15 dakika kadar zamana ihtiyacım var, şunu okudum...
(Peter kaba bir şekilde titiz ve çok akıllı olan küçüğün sözünü keser.)
Peter: Ayrı komutlar yazın, okunması daha kolay olacaktır.

Dockerfile büyüyor:

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

Sonra DevOps'tan Igor Ivanovich (ancak Dev'den daha fazla Ops) ofise dalıp bağırıyor:

AI: Petya, geliştiricilerin yine gıda veri tabanını kırdı, bu ne zaman bitecek...

Küçük bir çatışmanın ardından Igor Ivanovich sakinleşir ve meslektaşlarının burada ne yaptığını öğrenmeye başlar.

AI: Ne yapıyorsun?
Vasily: Peter yeni bir modül için Dockerfile oluşturmamda bana yardım ediyor.
AI: Bir bakayım... Buraya ne yazdın, ayrı bir komutla depoyu temizliyorsun, bu ek bir katman... Peki Gemfile'ı kopyalamadıysan bağımlılıkları nasıl kuracaksın! Ve genel olarak bu iyi değil.
Peter: Lütfen işine bak, bir şekilde çözeceğiz.

Igor Ivanovich üzgün bir şekilde iç çekiyor ve veritabanını kimin kırdığını bulmak için ayrılıyor.

Peter: Evet ama kod konusunda haklıydı, onu görüntünün içine yerleştirmemiz gerekiyor. Ve hemen ssh ve süpervizörü kuralım, yoksa daemonları başlatacağız.

Vasily: Sonra önce Gemfile ve Gemfile.lock'u kopyalayacağım, sonra her şeyi yükleyeceğim ve sonra tüm projeyi kopyalayacağım. Gemfile değişmezse katman önbellekten alınacaktır.
Peter: Neden hepiniz bu katmanlardasınız, her şeyi bir kerede kopyalayın. Hemen kopyalayın. İlk satır.

Docker dosyası artık şöyle görünüyor:

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: Peki sırada ne var? Süpervizör için yapılandırmalarınız var mı?
Vasily: Hayır, hayır. Ama bunu çabuk yapacağım.
Peter: O zaman yapacaksın. Şimdi her şeyi başlatacak bir başlatma betiğinin taslağını çizelim. Tamam, ssh'yi nohup ile başlatıyorsunuz, böylece konteynere bağlanıp neyin yanlış gittiğini görebiliriz. Daha sonra süpervizörü aynı şekilde çalıştırın. O zaman yolcu olarak çalıştırırsın.
S: Ancak Docker'ın bir şeylerin ters gittiğini bilmesi ve konteyneri yeniden başlatabilmesi için tek bir işlem olması gerektiğini okudum.
P: Saçma sapan şeylerle kafanı meşgul etme. Ve genel olarak nasıl? Tüm bunları tek bir süreçte nasıl çalıştırıyorsunuz? Igor Ivanovich'in istikrarı düşünmesine izin verin, maaş alması boşuna değil. Bizim işimiz kod yazmak. Ve genel olarak Dockefile'ı onun için yazdığımız için teşekkür etmesine izin verin.

10 dakika sonra kedilerle ilgili iki video.

S: Her şeyi yaptım. Daha fazla yorum ekledim.
P: Göster bana!

Dockerfile'ın en son sürümü:

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: Harika, hoşuma gitti. Ve yorumlar Rusça, kullanışlı ve okunabilir, herkes böyle çalışır. Sana her şeyi ben öğrettim, gerisini kendin yapabilirsin. Hadi gidip kahve içelim...

Şimdi, görüntüsü Igor Ivanovich'in işi bırakmak istemesine neden olacak ve gözleri bir hafta daha ağrıyacak, son derece berbat bir Dockerfile'ımız var. Dockerfile elbette daha da kötü olabilir, mükemmelliğin sınırı yoktur. Ama başlangıç ​​olarak bu işe yarayacaktır.

Grigory Oster'dan bir alıntıyla bitirmek istiyorum:

Henüz emin değilseniz
Hayattaki yolu seçtik,
Ve nedenini bilmiyorsun
Emek yolculuğunuza başlayın,
Koridorlardaki ampulleri kırın -
İnsanlar size "Teşekkür ederim" diyecek.
İnsanlara yardım edeceksin
Elektrikten tasarruf edin.

Kaynak: habr.com

Yorum ekle