かまたま日記3

プログラミングメイン、たまに日常

CicleCIでDockerイメージを再利用する

CircleCI v1の話です、v2.0になったらもうちょっと楽になってそう(未確認)

基本的には以下のページを参考にしてます。

Caching docker image on CircleCI

1. キャッシュ用のディレクトリを用意する

例えば ~/docker-images、これを circle.ymlcache_directories に追加しておく

dependencies:
  cache_directories:
    - "~/docker-images"

2. イメージのタグを生成する

Dockerfile と依存ファイル達の sha1sum を取る。

たとえばRailsアプリの場合、gemだけイメージに含めるなら GemfileGemfile.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