Github Actionsでdocker-composeのレイヤーキャッシュを使う方法
はじめに
Github Actionsでdocker-composeによるビルドを行う場合、なんの工夫もしないとレイヤーキャッシュが利用できず、
毎回イメージのダウンロードや、ライブラリのインストールなど、Dockerfileのレイヤーが全て上から実行されてしまいます。
今回は、docker-layer-cachingを利用して、Github Actions で docker-compose のレイヤーキャッシュを簡単に使う方法を見つけたので紹介します。
※今回のサンプルコードの完成品はこちらにupしています。
準備
サンプルとして、以下のようなシンプルなDockerfileとdocker-compose.ymlを定義します。
# docker-compose.yml
version: "3.8"
services:
nginx:
build:
context: .
dockerfile: Dockerfile
ports:
- "8888:80"
意図的に時間のかかるレイヤーを作るためにsleepを10分入れます。
# Dockerfile
FROM nginx:latest
RUN sleep 600
この構成でGithub Actionsでdocker-compose buildしてみます。
# .github/workflow/build.yml
name: build
on:
workflow_dispatch:
jobs:
build:
name: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: docker-compose build
実行結果はこちら。
想定通りdocker-compose buildに10分程度時間がかかっています。
stepを開いてみると、
dockerのレイヤーキャッシュが全く効いておらずフルビルドしていることがわかります。
手順
ではここからレイヤーキャッシュを利用していきます。
やることはとても簡単です。
以下のようにdocker-layer-cachingのactionを利用するstepを追加するだけです。
# .github/workflow/build.yml
name: build
on:
workflow_dispatch:
jobs:
build:
name: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
# ここを追加
- uses: satackey/action-docker-layer-caching@v0.0.11
continue-on-error: true
- run: docker-compose build
結果
この状態で再度ジョブを実行してみた結果がこちら。
docker-compose buildにかかる時間が短縮されていることがわかります。
stepを開いてみると、
sleepのレイヤーがUsing cache
となっており、レイヤーキャッシュが効いていることがわかります。
また、job全体を見てみると、2つのstepが増えていることがわかります。
Run satackey/action-docker-layer-caching@v0.0.11
ではキャッシュの読み込みを行っており、
Post Run satackey/action-docker-layer-caching@v0.0.11
ではキャッシュの保存をおこなっています。
ライブラリを大量にインストールしている場合など、キャッシュの容量が多くなる場合においては、
このキャッシュの読み書きにもそれなりに時間がかかるようです。
この辺りバランスを見て調整しないと時間の短縮は難しいかもしれません。
まとめ
今回は、docker-layer-cachingでGithubActionsのレイヤーキャッシュを有効化する具体的な方法を紹介しました。
CI/CDの改善をする時などに、役立てれば幸いです。
Discussion