🤠

Github Actionsでdocker-composeのレイヤーキャッシュを使う方法

2022/08/31に公開

はじめに

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