Help us understand the problem. What is going on with this article?

CircleCI + Docker で ADD によるキャッシュがなるだけ失われないようにする

More than 3 years have passed since last update.
Dockerfile
ADD cpanfile cpanfile.snapshot /app
RUN cd /app && carton install --deployment

などしてコンテナ内に CPAN モジュールを含めておく場合、ローカルリポジトリの cpanfile の mtime が変わるようなことが起きると ADD によるキャッシュはきかず carton やり直すはめになり時間がかかる。

CircleCI で Docker を利用してテストする際、ローカルリポジトリはキャッシュから展開されて clone ではなく pull されるようになっているので、cpanfile に実際の変更がなければ mtime 変わらないが、なぜか変わってしまうことがたまにあって時間がかかってしまうことがあるっぽい。

これは、ADD するファイルの mtime をコミット時の Commit Date に変更して、ファイルの内容に変化がなければ mtime も変わらないようにすることで防ぐことができる。

git-mtime
#!/usr/bin/env bash
set -eu

for file in $*; do
    touch -m -t $(date -d "$(git log -1 --pretty=format:%cd --date=iso $file)" +%Y%m%d%H%M.%S) $file
done

というスクリプトをリポジトリ内に用意しておいて、

circle.yaml
checkout:
  post:
    - tools/git-mtime cpanfile cpanfile.snapshot

と docker build する前に ADD するファイルは全部 mtime 変更やっておくとよい。

CircleCI に限った話でもないのでこのスクリプトは PATH のとおってる場所においておくと、

git mtime <file...>

として普段使いもできる(あまり使う機会はない...)。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした