
Ketika saya belajar mengendarai mobil, pada pelajaran pertama instruktur kembali ke persimpangan, dan kemudian berkata bahwa Anda tidak boleh melakukannya - tidak pernah sama sekali. Aturan ini saya ingat segera dan seumur hidup.
Anda membaca "Nasihat Buruk" untuk anak-anak oleh Grigory Oster, dan Anda melihat betapa mudah dan alami hal itu bagi mereka bahwa ini tidak dapat dilakukan.
Banyak artikel telah ditulis tentang cara menulis Dockerfile dengan benar. Tapi saya tidak menemukan petunjuk tentang cara menulis Dockerfile yang salah. Saya mengisi celah ini. Dan mungkin dalam proyek yang saya dapatkan untuk dukungan, akan ada lebih sedikit buruh pelabuhan seperti itu.
Semua pahlawan, situasi dan buruh pelabuhan adalah fiksi. Jika Anda mengenali diri Anda sendiri, maaf.
Buat Dockerfile, Ominous dan Terrible
Peter (Pengembang java / ruby ββ/ php senior): Colleague Vasily, apakah Anda sudah mengunggah modul baru ke Docker?
Basil (junior): Tidak, saya tidak tahu, saya tidak bisa mengatasinya dengan Docker ini. Begitu banyak artikel tentang itu, mataku melebar.
Peter: Kami mendapat tenggat waktu setahun yang lalu. Mari bantu, kami akan mencari tahu dalam proses. Katakan padaku apa yang tidak bisa kamu lakukan di sana.
Basil: Saya tidak bisa memilih gambar dasar sehingga minimal, tetapi ada semua yang dibutuhkan.
Peter: Ambil gambar ubuntu, ia memiliki semua yang Anda butuhkan. Dan apa yang berlebihan, maka akan berguna. Dan jangan lupa untuk memasang tag terbaru agar versinya selalu terbaru.
Dan di Dockerfile, baris pertama muncul:
FROM ubuntu:latest
Peter: Apa selanjutnya, apa yang kita tulis modul kita?
Basil: Jadi ruby, ada server web dan beberapa daemon layanan harus dimulai.
Peter: Ya, apa yang kita butuhkan: ruby, bundler, nodejs, imagemagick jadi apa lagi ... Dan pada saat yang sama, tingkatkan untuk mendapatkan paket baru pasti.
Basil: Dan kami tidak akan membuat pengguna, jadi bukan dari root?
Peter: Ya sudahlah, lalu masih main-main dengan hak.
Dengan mudah: Saya butuh waktu, sekitar 15 menit, untuk menyelesaikan semuanya dalam satu tim, saya baca itu ...
(Peter dengan kasar menginterupsi Juni yang sangat cermat dan sangat cerdas.)
Peter: Menulis dalam tim yang terpisah, dan akan lebih mudah dibaca.
Dockerfile tumbuh:
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 masuk ke kantor, DevOps (tetapi lebih banyak Ops daripada Dev), berteriak:
AI: Petya, pengembang Anda kembali memecahkan basis data prod, kapan itu berakhir ....
Setelah sedikit pertempuran, Igor Ivanovich menjadi tenang dan mulai mencari tahu apa yang dilakukan rekan-rekannya di sini.
AI: Apa yang kamu lakukan?
Basil: Peter membantu saya menyusun Dockerfile untuk modul baru.
II: Mari kita lihat ... Apa yang Anda tulis di sini, Anda membersihkan repositori dengan perintah terpisah, ini adalah lapisan tambahan ... Tapi bagaimana Anda meletakkan dependensi jika Anda tidak menyalin Gemfile! Lagi pula, ini tidak baik.
Peter: Silakan lanjutkan tentang bisnis Anda, kami akan mencari tahu entah bagaimana caranya.
Igor Ivanovich menghela nafas dengan sedih dan pergi untuk mencari tahu siapa yang telah merusak database.
Peter: Ya, tetapi tentang kode, dia mengatakan hal yang benar, Anda harus memasukkannya ke dalam gambar. Dan mari kita ssh dan atasan segera, kalau tidak kita akan memulai dasmon.
Dengan mudah: Kemudian saya salin Gemfile dan Gemfile.lock dulu, lalu saya masukkan semuanya, dan kemudian saya salin seluruh proyek. Jika Gemfile tidak berubah, layer akan diambil dari cache.
Peter: Apa yang kamu semua dengan 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/*
Peter: Jadi apa selanjutnya. Apakah Anda memiliki konfigurasi untuk penyelia?
Basil: Tidak, tidak. Tetapi saya akan melakukannya dengan cepat.
Peter: Kalau begitu lakukanlah. Sekarang mari kita sketsa skrip init yang akan menjalankan semuanya. Jadi, dengan itu, Anda mulai ssh dengan nohup sehingga kami dapat terhubung ke wadah dan melihat apa yang salah. Lalu luncurkan juga supervisor. Nah, kalau begitu jalankan saja penumpang.
T: Tapi saya membaca bahwa harus ada satu proses, jadi Docker akan tahu bahwa ada yang tidak beres dan dapat memulai ulang wadah.
P: Jangan repot-repot dengan kepala Anda. Dan secara umum, bagaimana? Bagaimana Anda menjalankan semuanya dalam satu proses? Biarkan Igor Ivanovich berpikir tentang stabilitas, bukan karena dia menerima gaji. Bisnis kami adalah menulis kode. Lagi pula, biarkan dia mengucapkan terima kasih karena telah menulis Dockefile untuknya.
Setelah 10 menit dan dua video tentang kucing.
T: Saya melakukan segalanya. Saya juga menambahkan komentar.
P: Tunjukkan!
Versi baru 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 suka itu. Dan komentar dalam bahasa Rusia nyaman dan mudah dibaca, semua orang akan bekerja seperti itu. Saya mengajari Anda segalanya, maka Anda bisa melakukannya sendiri. Ayo minum kopi ...
Nah, di sini kita punya Dockerfile yang benar-benar mengerikan, dari pandangan yang ingin Igor Ivanovich berhenti dan matanya akan sakit selama seminggu lagi. Dockerfile, tentu saja, bisa lebih buruk lagi, tidak ada batasan untuk kesempurnaan. Tetapi sebagai permulaan, itu akan berhasil.
Saya ingin mengakhiri dengan kutipan dari Gregory Oster:
Jika Anda belum tegas
Dalam hidup, mereka memilih jalan
Dan Anda tidak tahu mengapa
Kerjakan cara Anda untuk memulai,
Kalahkan lampu di beranda -
Orang akan mengucapkan terima kasih.
Anda akan membantu orang-orang
Lindungi listrik.
UPD : Dalam komentar mereka bertanya apa yang salah dengan Dockerfiles ini. Suatu hari saya akan menulis artikel terpisah dengan parsing kesalahan.