LoginSignup
2
3

More than 1 year has passed since last update.

GithubActionsでdocker composeを使いつつimageをキャッシュする(2021/12)

Last updated at Posted at 2021-12-30

前提

開発環境をdocker compose up一発で立ち上がるようにすると大変便利です。
当然GithubActions環境下でも同じようにコンテナを起動し、testやlintを実行したいところです。

しかし2021年12月31日現在、GithubActionsではdocker composeは何もしなくても使えるものの、BuildKitはデフォでは入っておらず、dockerのlayer cacheも勝手にはやってくれません。

ということで、毎回docker compose up -dでコンテナビルドをやり直さなくて済むようにBuildKitのcacheをgithub actionsに残していきたいと思います。

とりあえず成果物

この辺がキャッシュしてる部分になります

1つずつ何をしてるか確認していきます。

まずはcache

actions/cacheを使ってBuildKitのcacheを保持します。
ここではpoetry.lockのhashをkeyにしていますが、適宜パッケージマネージャのlockファイルなどに読み替えてください。
キャッシュするpathはどこでも構いません。

次にBuildKitのcache更新

ここが1つ目のミソです。
actions/cacheによってrestoreされたBuildKitのキャッシュを使ってコンテナイメージを作成したいところですが、このままコンテナイメージ作成を行うとキャッシュに変更があった場合に追加されます。
このまま開発していくとキャッシュがどんどん増え、GithubActionsのキャッシュ上限に引っかかるところまで行ってしまいます。
そこで一手間挟み、現在のキャッシュを使ってbuildを行いそこで発生したキャッシュのみを保存することにします。
まず,docker builder buildコマンドの--cache-fromで先程restoreしたディレクトリを指定し、--cache-toで新しいBuildKitのキャッシュを作ります。
そして、新しく作ったBuildKitキャッシュディレクトリをactions/cacheが保存してくれるディレクトリに上書きしてしまいます。
こうすることで古いキャッシュを消し新しいキャッシュのみを保存します。

そしてdocker compose up

なのですが、何故かGithubActions上のdocker composeはBuildKitを使ってくれませんでした。(原因掘ってないのでご存知の方はご一報を)
ということで、2つ目のミソです。
BuildKitを使うdocker builder以下にはbakeコマンドがあり、これはHCLやjson, ymlなどからbuildを行うことができます。
この機能を使ってdocker compose up前にコンテナイメージを作成してしまいます。
オプションが良くわからない感じですが、--loadはドキュメントにあるようにローカルのdocker daemonにイメージを保存するということで、-set *.cache-from=type=local,src=/tmp/.buildx-cacheはビルド時のcacheを先程上書きしたactions/cacheから読み込むという指定です。

これにより、BuildKitのキャッシュを使ってdocker daemonにイメージを作ることができ、ようやくdocker compose upする準備が整いました。

追記

docker builder buildで古いキャッシュから新しいキャッシュを作っていましたが、これだとdocker-compose.ymlに書いたことが使えないのでここでもbakeコマンドを使った方が楽でした。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3