Dockerfile saya adalah seperti
FROM my/base
ADD . /srv
RUN pip install -r requirements.txt
RUN python setup.py install
ENTRYPOINT ["run_server"]
Setiap kali saya membuat image baru, dependensi harus diinstal ulang, yang bisa sangat lambat di wilayah saya.
Salah satu cara saya memikirkan cache
paket yang telah diinstal adalah menimpa my/base
gambar dengan gambar yang lebih baru seperti ini:
docker build -t new_image_1 .
docker tag new_image_1 my/base
Jadi lain kali saya membangun dengan Dockerfile ini, / base saya sudah menginstal beberapa paket.
Tetapi solusi ini memiliki dua masalah:
- Tidak selalu mungkin untuk mengganti gambar dasar
- Gambar dasar semakin besar dan besar karena gambar yang lebih baru dilapisi di atasnya
Jadi solusi apa yang lebih baik yang dapat saya gunakan untuk mengatasi masalah ini?
EDIT ##:
Beberapa informasi tentang buruh pelabuhan di mesin saya:
☁ test docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
☁ test docker info
Containers: 0
Images: 56
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 56
Execution Driver: native-0.2
Kernel Version: 3.13.0-29-generic
WARNING: No swap limit support
my/base
Jawaban:
Coba buat Dockerfile yang terlihat seperti ini:
Docker akan menggunakan cache selama instalasi pip selama Anda tidak membuat perubahan apa pun pada
requirements.txt
, terlepas dari fakta apakah file kode lain di.
diubah atau tidak. Berikut contohnya.Berikut
Hello, World!
program sederhana :Output dari build buruh pelabuhan:
Mari memodifikasi
run.py
:Coba buat lagi, berikut ini hasilnya:
Seperti yang Anda lihat di atas, kali ini pekerja galangan kapal menggunakan cache selama proses pembuatan. Sekarang, mari perbarui
requirements.txt
:Di bawah ini adalah output dari build buruh pelabuhan:
Perhatikan bagaimana buruh pelabuhan tidak menggunakan cache selama instalasi pip. Jika tidak berhasil, periksa versi buruh pelabuhan Anda.
sumber
ADD
instruksi, cache tidak valid.ADD ./requirements.txt /srv/requirements.txt
), maka buruh pelabuhan harus menggunakan cache. Lihat menambahkan keamanan pada dokumen Dockerfile.ADD requirements.txt /srv
sebelum Anda menjalankan pip (RUN pip install -r requirements.txt
), dan menambahkan semua file lain setelah menjalankan pip. Jadi, mereka harus berada dalam urutan berikut: (1)ADD requirements.txt /srv
; (2)RUN pip install -r requirements.txt
; ( 3)ADD . /srv
Untuk meminimalkan aktivitas jaringan, Anda dapat mengarahkan
pip
ke direktori cache di mesin host Anda.Jalankan container docker Anda dengan bind direktori pip cache host Anda yang dipasang ke direktori pip cache container Anda.
docker run
perintah akan terlihat seperti ini:Kemudian di Dockerfile Anda, instal persyaratan Anda sebagai bagian dari
ENTRYPOINT
pernyataan (atauCMD
pernyataan), bukan sebagaiRUN
perintah. Ini penting, karena (seperti yang ditunjukkan dalam komentar) mount tidak tersedia selama pembuatan gambar (saatRUN
pernyataan dijalankan). File Docker akan terlihat seperti ini:sumber
Saya mengerti pertanyaan ini sudah memiliki beberapa jawaban populer. Tetapi ada cara yang lebih baru untuk menyimpan file dalam cache untuk manajer paket. Saya rasa ini bisa menjadi jawaban yang bagus di masa depan ketika BuildKit menjadi lebih standar.
Mulai Docker 18.09 ada dukungan eksperimental untuk BuildKit . BuildKit menambahkan dukungan untuk beberapa fitur baru di Dockerfile termasuk dukungan eksperimental untuk memasang volume eksternal ke dalam beberapa
RUN
langkah. Ini memungkinkan kami membuat cache untuk hal-hal seperti$HOME/.cache/pip/
.Kami akan menggunakan
requirements.txt
file berikut sebagai contoh:Contoh tipikal Python
Dockerfile
mungkin terlihat seperti:Dengan BuildKit diaktifkan menggunakan
DOCKER_BUILDKIT
variabel lingkungan, kita dapat membuatpip
langkah yang tidak di -cache dalam waktu sekitar 65 detik:Sekarang, mari kita tambahkan tajuk eksperimental dan modifikasi
RUN
langkah untuk menyimpan paket Python ke cache:Silakan dan lakukan build lain sekarang. Ini harus memakan waktu yang sama. Tapi kali ini cache paket Python di cache mount baru kami:
Sekitar 60 detik. Mirip dengan build pertama kami.
Buat perubahan kecil pada
requirements.txt
(seperti menambahkan baris baru di antara dua paket) untuk memaksa pembatalan cache dan dijalankan lagi:Hanya sekitar 16 detik!
Kami mendapatkan percepatan ini karena kami tidak lagi mengunduh semua paket Python. Mereka di-cache oleh manajer paket (
pip
dalam hal ini) dan disimpan dalam mount volume cache. Volume mount disediakan untuk langkah run sehinggapip
dapat menggunakan kembali paket yang sudah kami unduh. Ini terjadi di luar cache lapisan Docker .Keuntungannya harus jauh lebih baik pada yang lebih besar
requirements.txt
.Catatan:
Item BuildKit tidak berfungsi di bawah Docker Compose atau alat lain yang secara langsung menggunakan API Docker saat ini.Sekarang ada dukungan untuk ini di Docker Compose mulai 1.25.0. Lihat Bagaimana Anda mengaktifkan BuildKit dengan docker-compose?docker system prune -a
.Mudah-mudahan, fitur-fitur ini akan membuatnya menjadi Docker untuk dibangun dan BuildKit akan menjadi defaultnya. Jika / ketika itu terjadi, saya akan mencoba memperbarui jawaban ini.
sumber
Dockerfile
atau versi Docker terlalu lama. Saya akan membuat pertanyaan baru dengan semua informasi debugging Anda.Saya menemukan bahwa cara yang lebih baik adalah dengan menambahkan direktori paket situs Python sebagai volume.
Dengan cara ini saya bisa menginstal pustaka baru tanpa harus melakukan pembangunan ulang penuh.
EDIT : Abaikan jawaban ini, jawaban jkukul di atas berhasil untuk saya. Maksud saya adalah untuk meng-cache folder paket situs . Itu akan terlihat seperti:
Caching folder unduhan jauh lebih bersih. Itu juga meng-cache roda, sehingga dapat menyelesaikan tugas dengan benar.
sumber