webentwicklung-frage-antwort-db.com.de

So erzwingen Sie, dass Docker ein sauberes Image erstellt

Ich habe mit dem folgenden Befehl ein Docker-Image aus einer Docker-Datei erstellt.

$ docker build -t u12_core -f u12_core .

Wenn ich versuche, es mit dem gleichen Befehl neu zu erstellen, wird der Build-Cache wie folgt verwendet:

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 '[email protected]\s*required\s*[email protected] optional [email protected]' -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

Der Cache zeigt an, dass aerospike installiert ist. Ich finde es jedoch nicht in Containern, die aus diesem Image hervorgehen. Daher möchte ich dieses Image neu erstellen, ohne den Cache zu verwenden. Wie kann ich Docker zwingen, ein sauberes Image ohne den Cache wiederherzustellen?

587
Pavan Gupta

Es gibt eine --no-cache Option:

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

In älteren Docker-Versionen mussten Sie --no-cache=true übergeben, dies ist jedoch nicht mehr der Fall.

1083
Assaf Lavie

In einigen extremen Fällen können Sie wiederkehrende Build-Fehler nur umgehen, indem Sie Folgendes ausführen:

docker system Prune

Der Befehl fordert Sie zur Bestätigung auf:

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]

Dies ist natürlich keine direkte Antwort auf die Frage, könnte aber einige Leben retten ... Es hat meine gerettet.

104

Der Befehl docker build --no-cache . hat unser ähnliches Problem gelöst.

Unser Dockerfile war:

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

Sollte aber gewesen sein:

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

So verhindern Sie das Zwischenspeichern des Updates und installieren es separat.

Siehe: Best Practices zum Schreiben von Dockerfiles

53
Youniteus

Ich würde die Verwendung von --no-cache in Ihrem Fall nicht empfehlen.

Sie führen einige Installationen von Schritt 3 bis 9 aus (ich würde es übrigens vorziehen, einen Einzeiler zu verwenden), und wenn Sie nicht möchten, dass diese Schritte jedes Mal neu ausgeführt werden, wenn Sie Ihr Image erstellen, können Sie dies Ändern Sie Ihr Dockerfile mit einem temporären Schritt vor Ihrer wget Anweisung.

Ich mache etwas wie RUN ls . und ändere es in RUN ls ./, dann RUN ls ./. usw. für jede Änderung, die am von wget abgerufenen Tarball vorgenommen wird.

Sie können natürlich etwas wie RUN echo 'test1' > test && rm test tun, indem Sie die Zahl in 'test1 für jede Iteration erhöhen.

Es sieht schmutzig aus, aber meines Erachtens ist es der effizienteste Weg, weiterhin vom Cache-System von Docker zu profitieren, was Zeit spart, wenn Sie viele Ebenen haben ...

11
Olivier

Mit Docker-Compose versuchen Sie docker-compose up -d --build --force-recreate

2
Yash

Sie können den Builder-Cache mit docker builder verwalten.

So leeren Sie den gesamten Cache ohne Eingabeaufforderung: docker builder Prune -af

0
Shawn