2016-05-25 15 views
7

ドッキングステーションとプライベートレジストリを持つ1台のサーバーが2台あります。すべてのビルドステップでレジストリからキャッシュを使用するようにドッカーを設定する方法

私は最初のマシンにDockerfileを構築しました。私はレジストリに画像をプッシュしました。

私のレジストリからキャッシュを使用してすぐに2台目のマシンにDockerfileを構築することはできますか?いいえ、自分のキャッシュを作成せずに "ほとんど"同じDockerfilesをビルドするスピードを上げる方法はありますか?

--registry-mirrorをセットアップしようとしましたが、役に立たなかった。ドッキングウィンドウのための

+0

これを試しましたか? https://blog.docker.com/2015/10/registry-proxy-cache-docker-open-source/ –

+0

@JosipIvicはい、とにかくプライベートレジストリから引き出されたレイヤは無視されます。 –

答えて

5

> 1.10、私はこの問題について何かを見つけました:このDockerfile

FROM busybox 
RUN mkdir this-is-a-test 
RUN echo "hello world" 

実行docker build -t caching-test .

を考えるとhttps://github.com/docker/docker/issues/20316#issuecomment-221289631

その後、我々は、ドッキングウィンドウの履歴キャッシングで画像を含む層を見ることができますテスト

3e4a484f0e67  About an hour ago /bin/sh -c echo "Hello world!"     0 B     
6258cdec0c4b  About an hour ago /bin/sh -c mkdir this-is-a-test     0 B     
47bcc53f74dc  9 weeks ago   /bin/sh -C#(nop) CMD ["sh"]     0 B     
<missing>   9 weeks ago   /bin/sh -C#(nop) ADD file:47ca6e777c36a4cfff 1.113 MB 

1.11で保存/読み込みを変更すると、親と子のレイヤー間の関係は保持されますが、ドッカーで一緒に保存することによってのみ保存されます。私たちは、これが私たちのドッカー履歴出力から2番目に最上層であるdocker inspect test | grep Parent.

$ docker inspect caching-test | grep Parent 
"Parent": "sha256:6258cdec0c4bef5e5627f301b541555883e6c4b385d0798a7763cb191168ce09", 

を実行することによって、最終的なテスト画像の親を見ることができます。

saveとloadを使用してキャッシュを再作成するには、親として参照されているすべてのイメージとレイヤーを保存する必要があります。実際には、これは通常、同じコマンドでFROMイメージと同様に各レイヤーを保存する必要があることを意味します。

docker save caching-test 6258cdec0c4b busybox > caching-test.tar - IDの代わりにレイヤー名をsaveコマンドに与えることもできます。

すべてを消去してから、tarファイルからイメージをリロードしてみましょう。 docker rmi $(docker images -q)。イメージが存在しないことを確認します。

docker load -i caching-test.tarを実行します。イメージを見ると、ビジーボックスとキャッシングテストが表示されます。 docker history caching-testを実行すると、画像が最初に作成されたときとまったく同じ出力が表示されます。これは、親子関係が保存と読み込みによって保持されたためです。 docker inspect caching-test | grep Parentを実行して、親レイヤと同じIDを指定することもできます。

同じDockerfileのリビルドを実行すると、キャッシュが使用されていることが表示されます。

Sending build context to Docker daemon 5.391 MB 
Step 1 : FROM busybox 
---> 47bcc53f74dc 
Step 2 : RUN mkdir this-is-a-test 
---> Using cache 
---> 6258cdec0c4b 
Step 3 : RUN echo "hello world" 
---> Using cache 
---> 3e4a484f0e67 
Successfully built 3e4a484f0e67 

EDIT:この下には新しいものを構築する前にdocker pull theimagefromthefirstdockerfileontheregistry可能な第2のマシンでのみ 1.10ドッキングウィンドウの前に

に動作します。

そうすれば、すべてのレイヤーが2台目のマシンに存在することになります。

docker-engineは、レイヤーが構築されるたびにレジストリにクエリを出しません。それはあまりにも遅く/重いので別の方法があるとは思われません。

+0

申し訳ありませんが、これは私がDocker 1.11で観察しているものではありません。画像を引っ張っても、そのレイヤーをすべて引っ張るわけではありません。 'docker history'は最後のレイヤーを除くすべてのレイヤーを* *とし、' docker build'はゼロから再構築します。 –

+0

@dynamic_castうわー、そうです、この行動がいつ現れたのか分かりませんが、私が言ったことはずっと前ではなかったと確信しています。私は調査する –

+1

それを見つけた:https://github.com/docker/docker/issues/20131以来1.10 –

10

注:PR 26839 ("Implement build cache based on history array")がマージされているため、issue 20316 ("Pulling build cache")が閉じられました。

これにより、たとえば、以前のCIビルドの画像を--cache-fromに指定できます。

ビルド時にキャッシュソースとして使用されるイメージを指定する機能を追加します。これらのイメージはローカルの親チェーンを持つ必要はなく、他のレジストリから取得することもできます。ユーザーは、信頼できる画像のみをソースとして使用するようにする必要があります。

使用法:

docker pull myimage:v1.0 
docker build --cache-from myimage:v1.0 -t myimage:v1.1 . 

docker 1.13 (January 2017)ため、merge commit 7944480を参照してください。

+0

v1.13リリース、https://github.com/docker/docker/releasesに正式に含まれています。 – luka5z

+0

@ luka5zありがとう。私はそれに応じて答えを編集しました – VonC

+0

これはドッカーに着陸しているとき、任意のアイデアも同様に作成? – kilianc

関連する問題