Mam kilka RUN
poleceń w moim pliku Dockerfile, które chciałbym uruchamiać za -no-cache
każdym razem, gdy buduję obraz Dockera.
Rozumiem, że docker build --no-cache
wyłączy buforowanie dla całego pliku Dockerfile.
Czy można wyłączyć pamięć podręczną dla określonego polecenia RUN?
Odpowiedzi:
Zawsze istnieje opcja wstawienia bezsensownego i taniego do uruchomienia polecenia przed regionem, dla którego chcesz wyłączyć pamięć podręczną.
Zgodnie z propozycją w tym komentarzu do problemu można dodać blok argumentu budowania (nazwa może być dowolna):
przed takim regionem i modyfikuj jego wartość przy każdym uruchomieniu, dodając
--build-arg CACHEBUST=$(date +%s)
jakodocker build
argument (wartość może być również dowolna, w tym przypadku jest to bieżąca data i godzina, aby zapewnić jej niepowtarzalność między przebiegami).Spowoduje to oczywiście wyłączenie pamięci podręcznej również dla wszystkich kolejnych bloków, ponieważ suma hash obrazu pośredniego będzie inna, co sprawia, że naprawdę selektywna pamięć podręczna wyłącza nietrywialny problem, biorąc pod uwagę, jak obecnie działa docker.
źródło
---> Using cache
Wygląda na to, że już nie działa, po prostu dostałem się pod moją linią `` ARG CACHEBUST = 1` ... (i tak zrobiłem--build-arg CACHEBUST=$(date +%s)
w moim poleceniuRUN echo "$CACHEBUST"
ponieważ samo użycieARG
nie spowoduje unieważnienia pamięci podręcznejPosługiwać się
przed linią RUN, którą chcesz zawsze uruchamiać. Działa to, ponieważ ADD zawsze pobierze plik / adres URL, a powyższy adres URL generuje losowe dane przy każdym żądaniu, Docker następnie porównuje wynik, aby sprawdzić, czy może użyć pamięci podręcznej.
Przetestowałem również to i działa ładnie, ponieważ nie wymaga żadnych dodatkowych argumentów wiersza poleceń Dockera, a także działa z pliku Docker-compose.yaml :)
źródło
Nie bezpośrednio, ale możesz podzielić swój plik Dockerfile na kilka części, zbudować obraz, a następnie Z tego obrazu na początku następnego pliku Dockerfile i zbudować obraz z buforowaniem lub bez
źródło
Od lutego 2016 nie jest to możliwe.
Ta funkcja została zażądana w GitHub
źródło
funkcja dodana tydzień temu.
https://github.com/moby/moby/issues/1996#issuecomment-550020843
źródło
Uważam, że jest to niewielka poprawa w porównaniu z odpowiedzią @ steve powyżej:
Używa to pamięci podręcznej Docker klonu git, ale następnie uruchamia niebuforowaną aktualizację repozytorium.
Wydaje się, że działa i jest szybszy - ale wielkie podziękowania dla @steve za zapewnienie podstawowych zasad.
źródło
Kolejnym szybkim hackem jest zapisanie losowych bajtów przed poleceniem
wypisuje 5 losowych bajtów, które wymuszą brak pamięci podręcznej
źródło