Jak wymusić Docker dla czystej budowy obrazu

Zbudowałem Obraz Dockera z pliku Dockera używając poniższego polecenia.

$ docker build -t u12_core -f u12_core .

Kiedy próbuję go odbudować za pomocą tego samego polecenia, używa on build cache w stylu:

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <[email protected]>
 ---> Using cache
 ---> 4354ccf9dcd8
Step 3 : RUN apt-get update
 ---> Using cache
 ---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
 ---> Using cache
 ---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
 ---> Using cache
 ---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
 ---> Using cache
 ---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
 ---> Using cache
 ---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
 ---> Using cache
 ---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
 ---> Using cache
 ---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
 ---> Using cache
 ---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 ---> Using cache
 ---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
 ---> Using cache
 ---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
 ---> Using cache
 ---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
 ---> Using cache
 ---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
 ---> Using cache
 ---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
 ---> Using cache
 ---> 25f5fe70fa84
Successfully built 25f5fe70fa84

Pamięć podręczna pokazuje, że aerospike jest zainstalowany. Jednak nie znajduję go w kontenerach odradzających się z tego obrazu, więc chcę odbudować ten obraz bez użycia pamięci podręcznej. Jak zmusić Docker do odbudowy czystego obrazu bez pamięci podręcznej?

 344
Author: Peter Mortensen, 2016-02-24

4 answers

Istnieje --no-cache Opcja:

docker build --no-cache -t u12_core -f u12_core .

W starszych wersjach Dockera trzeba było przejść --no-cache=true, ale tak już nie jest.

 628
Author: Assaf Lavie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 15:38:00

W niektórych ekstremalnych przypadkach jedynym sposobem na obejście powtarzających się błędów jest uruchomienie:

docker system prune

Komenda poprosi o potwierdzenie:

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]
To oczywiście nie jest bezpośrednia odpowiedź na to pytanie, ale może uratować niektóre życia... To uratowało moje.
 59
Author: Wallace Sidhrée,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-23 10:13:24

Komenda docker build --no-cache . rozwiązała podobny problem.

Nasz plik Dockerfile to:

RUN apt-get update
RUN apt-get -y install php5-fpm

Ale powinno być:

RUN apt-get update && apt-get -y install php5-fpm

Aby zapobiec buforowaniu aktualizacji i zainstalować oddzielnie.

Zobacz: najlepsze praktyki pisania plików Dockerfiles

 39
Author: Youniteus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 15:39:43

Nie polecam stosowania --no-cache w Twoim przypadku.

Uruchamiasz kilka instalacji od kroku 3 do 9 (przy okazji wolałbym użyć jednego linera) i jeśli nie chcesz narzutu ponownego uruchamiania tych kroków za każdym razem, gdy budujesz swój obraz, możesz zmodyfikować Dockerfile za pomocą tymczasowego kroku przed instrukcją wget.

Używam do zrobienia czegoś takiego RUN ls . i zmieniam na RUN ls ./ potem RUN ls ./. itd. dla każdej modyfikacji wykonanej na tarballu pobranym przez wget

Można oczywiście zrobić coś w rodzaju RUN echo 'test1' > test && rm test zwiększenie liczby w 'test1 dla każdej iteracji.

Wygląda brudno, ale z tego, co wiem, Jest to najbardziej efektywny sposób na kontynuowanie korzystania z systemu pamięci podręcznej Dockera, co oszczędza czas, gdy masz wiele warstw...

 5
Author: Olivier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 15:40:43