Docker: saran yang buruk

Docker: saran yang buruk

Ketika saya sedang belajar mengemudi mobil, pada pelajaran pertama, instruktur mengemudi ke persimpangan secara terbalik, dan kemudian mengatakan bahwa Anda tidak boleh melakukan itu - tidak pernah sama sekali. Saya segera mengingat aturan ini dan selama sisa hidup saya.

Anda membacakan “Nasihat Buruk” oleh Grigory Oster kepada anak-anak, dan Anda melihat betapa mudah dan alaminya mereka sadar bahwa mereka tidak boleh melakukan ini.

Banyak artikel telah ditulis tentang cara menulis Dockerfile dengan benar. Namun saya tidak menemukan petunjuk tentang cara menulis Dockerfiles yang salah. Saya mengisi kesenjangan ini. Dan mungkin dalam proyek yang saya terima dukungannya, file docker seperti itu akan lebih sedikit.

Semua karakter, situasi, dan Dockerfile adalah fiktif. Jika Anda mengenali diri sendiri, maaf.

Membuat Dockerfile, tidak menyenangkan dan mengerikan

Peter (Pengembang senior java/rubby/php): Rekan Vasily, apakah Anda sudah mengunggah modul baru ke Docker?
Vasily (junior): Tidak, saya tidak punya waktu, saya tidak dapat memahaminya dengan Docker ini. Banyak sekali artikelnya, memusingkan.

Peter: Kami memiliki tenggat waktu setahun yang lalu. Biarkan saya membantu Anda, kami akan mencari tahu dalam prosesnya. Katakan padaku apa yang tidak berhasil untukmu.

Vasily: Saya tidak bisa memilih gambar dasar agar minimalis, tetapi saya memiliki semua yang Anda butuhkan.
Peter: Ambil gambar ubuntu, ia memiliki semua yang Anda butuhkan. Dan banyak hal yang tidak perlu akan berguna nantinya. Dan jangan lupa beri tag terbaru agar versinya selalu terbaru.

Dan baris pertama muncul di Dockerfile:

FROM ubuntu:latest

Peter: Selanjutnya apa yang kita gunakan untuk menulis modul kita?
Vasily: Jadi Ruby, ada server web dan beberapa daemon layanan harus diluncurkan.
Peter: Ya, apa yang kita butuhkan: ruby, bundler, nodejs, imagemagick dan apa lagi... Dan pada saat yang sama, lakukan upgrade untuk pasti mendapatkan paket baru.
Vasily: Dan kami tidak akan membuat pengguna agar kami tidak berada di bawah root?
Peter: Persetan, kalau begitu kamu masih harus main-main dengan haknya.
Vasily: Saya perlu waktu, sekitar 15 menit, untuk menggabungkan semuanya menjadi satu perintah, saya membacanya...
(Peter dengan kasar menyela junior yang teliti dan sangat pintar itu.)
Peter: Tulis dalam perintah terpisah, akan lebih mudah dibaca.

Dockerfile berkembang:

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

Kemudian Igor Ivanovich, DevOps (tetapi lebih merupakan Ops daripada Dev), menyerbu ke dalam kantor sambil berteriak:

AI: Petya, pengembangmu merusak database makanan lagi, kapan ini akan berakhir...

Setelah pertempuran kecil, Igor Ivanovich menjadi tenang dan mulai mencari tahu apa yang dilakukan rekan-rekannya di sini.

AI: Apa yang sedang kamu lakukan?
Vasily: Peter membantu saya membuat Dockerfile untuk modul baru.
AI: Coba saya lihat... Apa yang Anda tulis di sini, Anda membersihkan repositori dengan perintah terpisah, ini adalah lapisan tambahan... Tapi bagaimana Anda menginstal dependensi jika Anda belum menyalin Gemfile! Dan secara umum, ini tidak bagus.
Peter: Silakan jalankan bisnis Anda, kami akan mencari tahu bagaimana caranya.

Igor Ivanovich menghela nafas sedih dan pergi untuk mencari tahu siapa yang merusak database.

Peter: Ya, tapi dia benar tentang kodenya, kita perlu memasukkannya ke dalam gambar. Dan mari segera instal ssh dan supervisor, jika tidak kita akan memulai daemonnya.

Vasily: Kemudian saya akan menyalin Gemfile dan Gemfile.lock terlebih dahulu, kemudian saya akan menginstal semuanya, dan kemudian saya akan menyalin keseluruhan proyek. Jika Gemfile tidak berubah, lapisan tersebut akan diambil dari cache.
Peter: Mengapa Anda semua menggunakan lapisan ini, salin semuanya sekaligus. Salin segera. Baris pertama.

Dockerfile sekarang terlihat seperti ini:

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

Petrus: Jadi, apa selanjutnya? Apakah Anda memiliki konfigurasi untuk supervisor?
Dengan mudah: Tidak, tidak. Tapi aku akan melakukannya dengan cepat.
Petrus: Kalau begitu kamu akan melakukannya. Sekarang mari kita membuat sketsa skrip init yang akan meluncurkan semuanya. Oke, jadi Anda mulai ssh, dengan nohup, sehingga kita bisa terhubung ke container dan melihat apa yang salah. Kemudian jalankan supervisor dengan cara yang sama. Baiklah, kalau begitu kamu tinggal menjalankan penumpang.
T: Tapi saya membaca bahwa seharusnya ada satu proses, sehingga Docker akan mengetahui ada yang tidak beres dan dapat memulai ulang container.
P: Jangan pusingkan kepalamu dengan omong kosong. Dan secara umum, bagaimana caranya? Bagaimana Anda menjalankan semua ini dalam satu proses? Biarkan Igor Ivanovich memikirkan stabilitas, bukan tanpa alasan dia menerima gaji. Tugas kita adalah menulis kode. Dan secara umum, izinkan dia mengucapkan terima kasih karena kami telah menulis Dockefile untuknya.

10 menit dan dua video tentang kucing nanti.

T: Saya sudah melakukan semuanya. Saya menambahkan lebih banyak komentar.
P: Tunjukkan padaku!

Versi terbaru 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: Bagus, saya menyukainya. Dan komentarnya dalam bahasa Rusia, nyaman dan mudah dibaca, semua orang akan bekerja seperti itu. Aku mengajarimu segalanya, sisanya bisa kamu lakukan sendiri. Ayo kita minum kopi...

Nah, sekarang kita memiliki Dockerfile yang sangat buruk, pemandangannya akan membuat Igor Ivanovich ingin berhenti dan matanya akan sakit selama seminggu lagi. Dockerfile, tentu saja, bisa menjadi lebih buruk lagi, tidak ada batasan untuk kesempurnaan. Tapi sebagai permulaan, ini akan berhasil.

Saya ingin mengakhiri dengan kutipan dari Grigory Oster:

Jika Anda belum yakin
Kami memilih jalan hidup,
Dan Anda tidak tahu alasannya
Mulailah perjalanan persalinan Anda,
Hancurkan bola lampu di lorong -
Orang-orang akan mengatakan "Terima kasih" kepada Anda.
Anda akan membantu orang-orang
Menghemat listrik.

Sumber: www.habr.com

Tambah komentar