W pliku Dockerfile mam warstwę, która instaluje requirements.txt
:
FROM python:2.7
RUN pip install -r requirements.txt
Kiedy buduję obraz dockera, uruchamia cały proces niezależnie od zmian wprowadzonych w tym pliku.
Jak się upewnić, że Docker działa tylko pip install -r requirements.txt
wtedy, gdy nastąpiła zmiana w pliku?
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))
python
docker
dockerfile
Prometeusz
źródło
źródło
docker build
(i swojeDockerfile
). Przypuszczalnie jest to wcześniejszy krok w procesie kompilacji, który zrywa pamięć podręczną, powodując uruchomienie tego kroku.Odpowiedzi:
Zakładam, że w pewnym momencie procesu kompilacji kopiujesz całą aplikację do obrazu platformy Docker za pomocą
COPY
lubADD
:Problem polega na tym, że za każdym razem, gdy kopiujesz całą aplikację do obrazu, unieważniasz pamięć podręczną kompilacji platformy Docker. Spowoduje to również unieważnienie pamięci podręcznej dla wszystkich kolejnych kroków kompilacji.
Aby temu zapobiec, sugerowałbym skopiowanie tylko
requirements.txt
pliku w oddzielnym kroku kompilacji przed dodaniem całej aplikacji do obrazu:COPY requirements.txt /opt/app/requirements.txt WORKDIR /opt/app RUN pip install -r requirements.txt COPY . /opt/app # continue as before...
Ponieważ sam plik wymagań prawdopodobnie zmienia się rzadko, będziesz mógł używać warstw z pamięci podręcznej do momentu dodania kodu aplikacji do obrazu.
źródło
COPY
jest preferowana,ADD
chyba że wyraźnie potrzebujesz zachowaniaADD
.ADD
jest potrzebny tylko wtedy, gdy<src>
folder zawiera archiwum, które musi zostać rozpakowane lub musi obsługiwać zdalną obsługę adresów URL. {kod źródłowy}Jest to bezpośrednio wspomniane we własnych „ Najlepszych praktykach dotyczących pisania Dockerfiles ”:
źródło
Alternatywnie, aby przyspieszyć uruchomienie pliku Requirements.txt bez wpisywania „tak” w celu potwierdzenia instalacji bibliotek, możesz ponownie napisać jako:
COPY requirements.txt ./ RUN pip install -y -r requirements.txt COPY ./"dir"/* .
źródło