Docker bagaimana cara menjalankan pip terms.txt hanya jika ada perubahan?

91

Di Dockerfile saya memiliki lapisan yang menginstal requirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

Ketika saya membangun image buruh pelabuhan itu menjalankan seluruh proses terlepas dari perubahan apa pun yang dilakukan pada file ini.

Bagaimana cara memastikan Docker hanya berjalan pip install -r requirements.txtjika telah ada perubahan pada file?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
Prometheus
sumber
1
Harap posting keluaran docker build(dan Anda Dockerfile). Agaknya, ini adalah langkah awal dalam proses build Anda yang merusak cache, menyebabkan langkah ini berjalan.
Thomas Orozco
perbarui OP dengan semua yang saya miliki saat ini
Prometheus
1
Hanya langkah ini yang tidak berguna. Silakan posting output lengkap (atau setidaknya Dockerfile).
Thomas Orozco

Jawaban:

171

Saya berasumsi bahwa di beberapa titik dalam proses build Anda, Anda menyalin seluruh aplikasi Anda ke image Docker dengan COPYatau ADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

Masalahnya adalah Anda membuat cache build Docker tidak valid setiap kali Anda menyalin seluruh aplikasi ke dalam image. Ini juga akan membuat cache tidak valid untuk semua langkah build selanjutnya.

Untuk mencegah hal ini, saya sarankan untuk menyalin hanyarequirements.txt file dalam langkah pembuatan terpisah sebelum menambahkan seluruh aplikasi ke dalam gambar:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

Karena file persyaratan itu sendiri mungkin jarang berubah, Anda akan dapat menggunakan lapisan yang di-cache hingga Anda menambahkan kode aplikasi ke dalam gambar.

helmbert
sumber
8
Sebagai pedoman umum, saya yakin COPYlebih disukai daripada ADDAnda secara khusus membutuhkan perilaku ADD.
Metropolis
2
@ Metropolis, Anda sepenuhnya benar. Terima kasih atas petunjuknya.
helmbert
5
Setuju dengan @Metropolis. ADDhanya diperlukan jika <src>folder berisi arsip apa pun yang perlu dibuka kemasannya atau perlu mendukung penanganan URL jarak jauh. {source code}
Mohsin
44

Ini secara langsung disebutkan dalam " Praktik terbaik untuk menulis Dockerfiles " milik Docker :

Jika Anda memiliki beberapa langkah Dockerfile yang menggunakan file berbeda dari konteks Anda, SALIN mereka satu per satu, bukan semuanya sekaligus. Ini akan memastikan bahwa setiap build cache langkah hanya tidak valid (memaksa langkah tersebut dijalankan ulang) jika file yang diperlukan secara khusus berubah.

Sebagai contoh:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

Menghasilkan lebih sedikit pembatalan cache untuk langkah RUN, dibandingkan jika Anda meletakkan COPY. / tmp / sebelumnya.

jrc
sumber
0

Atau sebagai cara yang lebih cepat untuk menjalankan file requirement.txt tanpa mengetik "ya" untuk mengonfirmasi pemasangan pustaka, Anda dapat menulis ulang sebagai:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
Asante Michael
sumber