CircleCI v1の話です、v2.0になったらもうちょっと楽になってそう(未確認)
基本的には以下のページを参考にしてます。
Caching docker image on CircleCI
1. キャッシュ用のディレクトリを用意する
例えば ~/docker-images
、これを circle.yml
の cache_directories
に追加しておく
dependencies: cache_directories: - "~/docker-images"
2. イメージのタグを生成する
Dockerfile
と依存ファイル達の sha1sum
を取る。
たとえばRailsアプリの場合、gemだけイメージに含めるなら Gemfile
と Gemfile.lock
これらに変更が無ければ同じ値になるはず。(なのでキャッシュが使えるはず)
tag=$(sha1sum Dockerfile Gemfile Gemfile.lock | sha1sum | cut -d' ' -f1)
アプリ全体をイメージに入れるなら全ソースファイルを対象とする
3. ビルドしたイメージをdocker saveする
こんな感じ
docker save ${image_name}:${tag} > ~/docker-images/${image_name}-${tag}.tar
4. 再ビルドするときにキャッシュを使う
イメージのタグを算出してキャッシュディレクトリにあったら docker load
する
if [[ -e ~/docker-images/${image_name}-${tag}.tar ]]; then docker load -i ~/docker-images/${image_name}-${tag}.tar else # 略. buildしてsaveする fi