Hoe Docker te forceren voor een schone build van een afbeelding

Ik heb een Docker-image gemaakt van een Docker-bestand met de onderstaande opdracht.

$ docker build -t u12_core -f u12_core .

Als ik het probeer te herbouwen met hetzelfde commando, gebruikt het de build-cache zoals:

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

De cache laat zien dat de luchtvospike is geïnstalleerd. Ik vind het echter niet in containers spawn uit deze afbeelding, dus ik wil dit beeld opnieuw opbouwen zonder de cache te gebruiken. Hoe kan ik Docker forceren om een ​​schone afbeelding te herbouwen zonder de cache?


1, Autoriteit 100%

Er is een --no-cacheoptie:

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

In oudere versies van Docker moet je doorgeven --no-cache=true, maar dit is niet langer het geval.


2, Autoriteit 8%

In sommige extreme gevallen is uw enige manier rond terugkerende buildstoringen door:

docker system prune

De opdracht vraagt ​​u om uw bevestiging:

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]

Dit is natuurlijk geen direct antwoord op de vraag, maar kan een aantal levens redden … het heeft de mijne besproken.


3, Autoriteit 4%

De opdracht docker build --no-cache .Opgelost ons soortgelijke probleem.

Onze Dockerfile was:

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

Maar had moeten zijn:

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

Om de update van de update te voorkomen en afzonderlijk te installeren.

Zie: Best practices voor het schrijven van Dockerfiles


Antwoord 4, autoriteit 3%

Gebruik de volgende opties bij het bouwen om ervoor te zorgen dat uw build volledig opnieuw wordt opgebouwd, inclusief het controleren van de basisimage op updates:

--no-cache– Hierdoor worden reeds beschikbare lagen opnieuw opgebouwd

--pull– Dit activeert een pull van de basisafbeelding waarnaar wordt verwezen met FROM, zodat u zeker weet dat u over de nieuwste versie beschikt.

Het volledige commando ziet er daarom als volgt uit:

docker build --pull --no-cache --tag myimage:version .

Dezelfde opties zijn beschikbaar voor docker-compose:

docker-compose build --no-cache --pull

Merk opdat als uw docker-compose-bestand naar een afbeelding verwijst, de optie –pull de afbeelding niet daadwerkelijk zal ophalen als die er al is.

Om docker-compose te dwingen dit opnieuw te doen, kun je het volgende uitvoeren:

docker-compose pull

Antwoord 5

De meeste informatie hier is correct.
Hier een compilatie ervan en mijn manier om ze te gebruiken.

Het idee is om vast te houden aan de aanbevolen aanpak (specifiek bouwen en geen impact op andere opgeslagen docker-objecten) en de meer radicale aanpak te proberen (niet specifiek bouwen en met impact op andere opgeslagen docker-objecten) wanneer dit niet genoeg is.

Aanbevolen aanpak:

1) Forceer de uitvoering van elke stap/instructie in de Dockerfile:

docker build --no-cache 

of met docker-compose build:

docker-compose build --no-cache

We zouden dat ook kunnen combineren met het upsubcommando dat alle containers opnieuw maakt:

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 

Gebruik op deze manier geen cache, maar voor de docker-builder en de basisafbeelding waarnaar wordt verwezen met de FROM-instructie.

2) Wis de cache van de docker-builder (als we Buildkit gebruiken, hebben we dat zeer waarschijnlijk nodig):

docker builder prune -af

3) Als we de cache van de bovenliggende afbeeldingen niet willen gebruiken, kunnen we proberen ze te verwijderen, zoals:

docker image rm -f fooParentImage

In de meeste gevallen zijn deze drie dingen perfect genoeg om een schone opbouw van ons imago mogelijk te maken.
Daar moeten we ons dus aan proberen te houden.

Radicalere aanpak:

In gevallen waarin het lijkt alsof sommige objecten in de docker-cache nog steeds worden gebruikt tijdens de build en dat er herhaalbaar uitziet, moeten we proberen de oorzaak te begrijpen om het ontbrekende deel heel specifiek te kunnen wissen.
Als we echt geen manier vinden om helemaal opnieuw op te bouwen, zijn er andere manieren, maar het is belangrijk om te onthouden dat deze over het algemeen veel meer verwijderen dan nodig is. We moeten ze dus over het algemeen voorzichtig gebruiken als we ons niet in een lokale/dev-omgeving bevinden.

1) Verwijder alle afbeeldingen zonder ten minste één daaraan gekoppelde container:

docker image prune -a

2) Verwijder nog veel meer dingen:

docker system prune -a

Dat zegt:

WAARSCHUWING! Dit zal verwijderen:
 - alle gestopte containers
 - alle netwerken die niet door ten minste één container worden gebruikt
 - alle afbeeldingen zonder ten minste één daaraan gekoppelde container
 - alle bouwcache

Het gebruik van dat super delete-commando is misschien niet genoeg omdat het sterk afhangt van de status van containers (al dan niet actief).
Wanneer dat opdracht niet genoeg is, probeer ik zorgvuldig te denken welke dockercontainers bijwerkingen kunnen veroorzaken bij onze Docker Build en om deze containers te laten verlaten om toe te staan ​​dat ze met het commando worden verwijderd.


6

Met Docker-Compose Probeer docker-compose up -d --build --force-recreate


7

U kunt de bouwercache beheren met docker builder

Alle cache reinigen zonder prompt:
docker builder prune -af


8

GUI-gedreven aanpak: Open de DockTop-tool (die meestal met docker wordt geleverd):

  1. onder “Containers / apps” stoppen met alle lopende instanties van die afbeelding
  2. onder “afbeeldingen” Verwijder de buildafbeelding (Hover over de vak Box om een ​​contextmenu te krijgen), uiteindelijk ook de onderliggende basisafbeelding

Other episodes