Edited at

【古い記事・今はできる】CircleCI で Docker ビルドキャッシュができない理由

More than 1 year has passed since last update.


2017/04 追記

CircleCI 2.0 で Docker のバージョンが上がったためキャッシュできるようになりました

以下は CircleCI 1.0 時代になぜできなかったのかの説明


やりたいこと


  • CircleCI の Docker イメージビルドが遅い


    • イメージキャッシュが引き継がれないため



  • なんとかしてイメージキャッシュを引き継ぎたい


TL;DR


CircleCI ドキュメントにある workaround は効かない

Caching Docker layers

docker save でイメージを CircleCI にキャッシュさせて、docker load で引き継ぐ方法。

2016年10月現在 CircleCI の Docker はバージョン 1.10 で、この方法は使えない。


Docker 1.10

Docker 1.10 でレイヤ情報がイメージに含まれなくなった。

https://github.com/docker/docker/issues/20380#issuecomment-184978854

このバージョンでキャッシュを持ち越す方法は、おそらく /var/lib/docker 以下をハックする以外にない。


Docker 1.11 / 1.12

このバージョンでは、tonistiigi/buildcache を使ってビルドキャッシュデータを save & load できる。

また、docker load でレイヤ情報を復元できるようになった (https://github.com/docker/docker/pull/21385) ので、


  1. docker save {history全部} > cache.tar

  2. docker load -i cache.tar

でキャッシュが復元できる。(詳細: https://github.com/docker/docker/issues/20316#issuecomment-221289631)


Docker 1.13 (未リリース)

docker build に cache-from オプションが追加される。

https://github.com/docker/docker/pull/26839

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

docker save と組み合わせてうまくやれると思う。


結論

CircleCI を諦める / Docker 1.11 以降の対応を待つ