Docker: nasihat buruk

Docker: nasihat buruk

Semasa saya belajar memandu kereta, pada pelajaran pertama, pengajar memandu ke persimpangan secara terbalik, dan kemudian berkata bahawa anda tidak sepatutnya melakukannya - tidak sama sekali. Saya teringat peraturan ini serta-merta dan sepanjang hayat saya.

Anda membaca "Nasihat Buruk" oleh Grigory Oster kepada kanak-kanak, dan anda melihat betapa mudah dan semula jadi mereka sedar bahawa mereka tidak sepatutnya melakukan ini.

Banyak artikel telah ditulis tentang cara menulis Dockerfile dengan betul. Tetapi saya tidak menemui arahan tentang cara menulis fail Docker yang salah. Saya sedang mengisi kekosongan ini. Dan mungkin dalam projek yang saya terima sokongan, akan ada lebih sedikit dockerfiles sedemikian.

Semua watak, situasi dan Dockerfile adalah rekaan. Jika anda mengenali diri anda, maaf.

Mencipta fail Docker, tidak menyenangkan dan mengerikan

Peter (Pembangun senior java/rubby/php): Rakan sekerja Vasily, adakah anda sudah memuat naik modul baharu ke Docker?
Vasily (junior): Tidak, saya tidak mempunyai masa, saya tidak dapat memikirkannya dengan Docker ini. Terdapat banyak artikel mengenainya, ia memeningkan.

Peter: Kami mempunyai tarikh akhir setahun yang lalu. Biar saya bantu anda, kami akan memikirkannya dalam proses. Beritahu saya apa yang tidak berkesan untuk anda.

Vasily: Saya tidak boleh memilih imej asas supaya ia minimum, tetapi mempunyai semua yang anda perlukan.
Peter: Ambil imej ubuntu, ia mempunyai semua yang anda perlukan. Dan apa yang banyak perkara yang tidak perlu akan berguna kemudian. Dan jangan lupa untuk meletakkan tag terkini supaya versi sentiasa terkini.

Dan baris pertama muncul dalam Dockerfile:

FROM ubuntu:latest

Peter: Apa yang seterusnya, apa yang kami gunakan untuk menulis modul kami?
Vasily: Jadi ruby, terdapat pelayan web dan beberapa daemon perkhidmatan harus dilancarkan.
Peter: Ya, apa yang kita perlukan: ruby, bundler, nodejs, imagemagick dan apa lagi... Dan pada masa yang sama, lakukan peningkatan untuk pasti mendapatkan pakej baharu.
Vasily: Dan kami tidak akan mencipta pengguna supaya kami tidak berada di bawah akar?
Peter: Persetankan, maka anda masih perlu bermain-main dengan hak.
Vasily: Saya memerlukan masa, kira-kira 15 minit, untuk menyusun semuanya menjadi satu arahan, saya membacanya...
(Peter dengan kasar mengganggu junior yang teliti dan sangat pintar.)
Peter: Tulis dalam arahan berasingan, ia 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 banyak Ops daripada Dev), menyerbu ke pejabat sambil menjerit:

AI: Petya, pembangun anda memecahkan pangkalan data makanan sekali lagi, bila ini akan berakhir...

Selepas pertempuran kecil, Igor Ivanovich menjadi tenang dan mula mengetahui apa yang dilakukan oleh rakan-rakannya di sini.

AI: Awak buat apa?
Vasily: Peter sedang membantu saya mencipta Dockerfile untuk modul baharu.
AI: Biar saya lihat... Apa yang anda tulis di sini, anda membersihkan repositori dengan arahan yang berasingan, ini adalah lapisan tambahan... Tetapi bagaimana anda memasang dependensi jika anda belum menyalin Gemfile! Dan secara umum, ini tidak baik.
Peter: Sila lakukan perniagaan anda, kami akan memikirkannya entah bagaimana.

Igor Ivanovich mengeluh sedih dan pergi untuk mengetahui siapa yang memecahkan pangkalan data.

Peter: Ya, tetapi dia betul tentang kod itu, kita perlu menolaknya ke dalam imej. Dan mari pasang segera ssh dan penyelia, jika tidak, kami akan memulakan daemon.

Vasily: Kemudian saya akan mula-mula menyalin Gemfile dan Gemfile.lock, kemudian saya akan memasang segala-galanya, dan kemudian saya akan menyalin keseluruhan projek. Jika Gemfile tidak berubah, lapisan akan diambil dari cache.
Peter: Mengapa anda semua dengan lapisan ini, salin semuanya sekaligus. Salin segera. Baris pertama.

Fail Docker kini kelihatan 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 seterusnya? Adakah anda mempunyai konfigurasi untuk penyelia?
Vasily: Tidak, tidak. Tetapi saya akan melakukannya dengan cepat.
Peter: Kemudian anda akan melakukannya. Sekarang mari kita lakarkan skrip init yang akan melancarkan segala-galanya. Okey, jadi anda mulakan ssh, dengan nohup, supaya kita boleh menyambung ke bekas dan melihat apa yang salah. Kemudian jalankan penyelia dengan cara yang sama. Nah, kemudian anda hanya menjalankan penumpang.
S: Tetapi saya membaca bahawa perlu ada satu proses, jadi Docker akan tahu bahawa sesuatu telah berlaku dan boleh memulakan semula bekas.
P: Jangan kacau kepala anda dengan perkara yang bukan-bukan. Dan secara umum, bagaimana? Bagaimanakah anda menjalankan semua ini dalam satu proses? Biarkan Igor Ivanovich berfikir tentang kestabilan, bukan tanpa alasan dia menerima gaji. Tugas kita ialah menulis kod. Dan secara umum, biarkan dia mengucapkan terima kasih kerana kami menulis Dockefile untuknya.

10 minit dan dua video tentang kucing kemudian.

S: Saya telah melakukan segala-galanya. Saya menambah lebih banyak komen.
P: Tunjukkan saya!

Versi terkini 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. Dan komen dalam bahasa Rusia, mudah dan boleh dibaca, semua orang akan bekerja seperti itu. Saya ajar awak semua, selebihnya awak boleh buat sendiri. Jom minum kopi...

Nah, sekarang kita mempunyai Dockerfile yang sangat mengerikan, pemandangannya akan membuatkan Igor Ivanovich mahu berhenti dan matanya akan sakit selama seminggu lagi. Fail Docker, sudah tentu, boleh menjadi lebih teruk, tiada had untuk kesempurnaan. Tetapi sebagai permulaan, ini akan dilakukan.

Saya ingin mengakhiri dengan petikan daripada Grigory Oster:

Jika anda masih belum pasti
Kami memilih jalan dalam hidup,
Dan anda tidak tahu mengapa
Mulakan perjalanan buruh anda,
Pecahkan mentol di lorong -
Orang akan berkata "Terima kasih" kepada anda.
Anda akan membantu rakyat
Jimat elektrik.

Sumber: www.habr.com

Tambah komen