Docker, yalnızca bir değişiklik olduğunda pip gereksinimleri.txt'yi nasıl çalıştırır?


91

Dockerfile'da şunları yükleyen bir katmanım var requirements.txt:

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

Docker görüntüsünü oluşturduğumda, bu dosyada yapılan herhangi bir değişiklikten bağımsız olarak tüm süreci çalıştırır .

Docker'ın yalnızca pip install -r requirements.txtdosyada bir değişiklik olduğunda çalıştığından nasıl emin olabilirim?

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))

1
Lütfen docker build(ve sizin Dockerfile) çıktısını gönderin . Muhtemelen, önbelleği bozan ve bu adımın çalışmasına neden olan, oluşturma işleminizin daha önceki bir adımıdır.
Thomas Orozco


1
Sadece bu adım kullanışlı değil. Lütfen çıktının tamamını (veya en azından Dockerfile'ı) gönderin.
Thomas Orozco

Yanıtlar:


171

Derleme sürecinizin bir noktasında tüm uygulamanızı Docker görüntüsüne COPYveya ile kopyaladığınızı varsayıyorum ADD:

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

Sorun, tüm uygulamayı görüntüye her kopyaladığınızda Docker derleme önbelleğini geçersiz kılmanızdır. Bu, sonraki tüm oluşturma adımları için önbelleği de geçersiz kılacaktır.

Bunu önlemek için , tüm uygulamayı görüntüye eklemeden önce yalnızcarequirements.txt dosyayı ayrı bir derleme adımında kopyalamanızı öneririm :

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

Gereksinimler dosyasının kendisi muhtemelen nadiren değiştiğinden, önbelleğe alınmış katmanları uygulama kodunuzu görüntüye ekleyene kadar kullanabilirsiniz.


8
Genel bir kılavuz olarak, özellikle davranışına ihtiyacınız olmadıkça COPYtercih edildiğine inanıyorum . ADDADD
Metropolis

2
@Metropolis, tamamen haklısın. İpucu için teşekkürler.
helmbert

5
@ Metropolis ile katılıyorum. ADDYalnızca <src>klasör, paketinden çıkarılması gereken veya uzak URL işlemeyi desteklemesi gereken herhangi bir arşiv içeriyorsa gereklidir. {kaynak kodu}
Mohsin

44

Bu, Docker'ın kendi " Dockerfiles yazmak için en iyi yöntemler " bölümünde doğrudan belirtilmiştir :

Bağlamınızdan farklı dosyalar kullanan birden fazla Dockerfile adımınız varsa hepsini bir kerede KOPYALAYIN, tek tek KOPYALAYIN. Bu, her adımın derleme önbelleğinin yalnızca, özellikle gerekli dosyalar değişirse geçersiz kılınmasını (adımı yeniden çalıştırmaya zorlar) sağlar.

Örneğin:

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

ÇALIŞTIR adımı için, KOPYALA koymanıza kıyasla daha az önbellek geçersiz kılma ile sonuçlanır. / tmp / ondan önce.


0

Alternatif olarak, kitaplıkların kurulumunu onaylamak için "evet" yazmadan gereksinim.txt dosyasını çalıştırmanın daha hızlı bir yolu olarak, şu şekilde yeniden yazabilirsiniz:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.