2017/04 追記
CircleCI 2.0 で Docker のバージョンが上がったためキャッシュできるようになりました
以下は CircleCI 1.0 時代になぜできなかったのかの説明
やりたいこと
- CircleCI の Docker イメージビルドが遅い
- イメージキャッシュが引き継がれないため
- なんとかしてイメージキャッシュを引き継ぎたい
TL;DR
- CircleCI の Docker バージョンが 1.10 の間は、無理
- もう少しでなにかしらのアナウンスがあるらしい (https://discuss.circleci.com/t/request-docker-1-12/5120/13)
- Docker 1.11 対応を待つ
- Docker 1.13 リリース & 対応を待つ
- cache-from オプションが追加された
CircleCI ドキュメントにある workaround は効かない
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) ので、
docker save {history全部} > cache.tar
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 以降の対応を待つ