webdevqa.jp.net

Dockerにイメージのクリーンビルドを強制する方法

下記のコマンドを使ってDockerファイルからDockerイメージを構築しました。

$ docker build -t u12_core -f u12_core .

私が同じコマンドでそれを再構築しようとしているとき、それは次のようなビルドキャッシュを使っています:

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

キャッシュはaerospikeがインストールされていることを示しています。しかし、このイメージから生成されたコンテナーの中には見つからないので、キャッシュを使用せずにこのイメージを再構築したいと思います。どうすればDockerにキャッシュなしでクリーンなイメージを再構築させることができますか?

498
Pavan Gupta

--no-cacheオプションがあります。

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

古いバージョンのDockerでは--no-cache=trueを渡す必要がありましたが、これはもはや当てはまりません。

925
Assaf Lavie

極端な場合には、ビルド失敗を繰り返すための唯一の方法は次のコマンドを実行することです。

docker system Prune

確認のメッセージが表示されます。

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]

これはもちろん質問に対する直接的な答えではありませんが、いくつかの命を救うかもしれません...それは私の命を救いました。

89

コマンドdocker build --no-cache .は、同様の問題を解決しました。

私たちのDockerfileは次のとおりです。

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

しかしだったはずです:

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

アップデートのキャッシュを防ぎ、別々にインストールする。

参照:Dockerfilesを書くためのベストプラクティス

50
Youniteus

あなたのケースでは--no-cacheを使うことをお勧めしません。

あなたはステップ3から9までのいくつかのインストールを実行しています(ちなみに、ワンライナーを使用することをお勧めします)。イメージを構築するたびにこれらのステップを再実行するオーバーヘッドが不要な場合は可能です。 Dockerfile命令の前に一時的なステップでwgetを修正してください。

wgetによって取得されたtarballに対して行われる各修正のために、RUN ls .のようなことをし、それをRUN ls ./そしてRUN ls ./.のように変更するのに使います。

もちろん、繰り返しごとにRUN echo 'test1' > test && rm testの数を増やす'test1のようなことをすることもできます。

汚れているように見えますが、私の知る限りでは、Dockerのキャッシュシステムから恩恵を受けるための最も効率的な方法です。

10
Olivier

Docker-composeでdocker-compose up -d --build --force-recreateを試してください

2
Yash

docker builderを使用してビルダーキャッシュを管理できます

プロンプトなしですべてのキャッシュを消去するには:docker builder Prune -af

0
Shawn