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?
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.
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.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.
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...
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