はじめに
自分で作ったシステム(スプレッドシートの家計簿を更新&画像で報告)を実行するのにGitHub Actionsを使用しているんですが、これが遅くてちょっとイラッとしていました。
なんとなく原因の見当はついていて、docker compose使用時のビルド周りで遅くなってるんだろうなと。
dockerでの環境構築を毎回同じようにさせるのは無駄の極みすぎるので、キャッシュの利用をしようと調べてみました。
今回のDockerfileではARG
を使用しており、この変数に値を渡すのに少し手間取ったのでそこにも触れます。
初心者の備忘録なので、間違い等あればぜひご指摘お願いします。
結論
GitHub Actionsにて、docker/setup-buildx-action@v3
とdocker/build-push-action@v6
を利用することでキャッシュ利用できました。
# 後のstepで使うため、環境変数に設定
- name: create UID & GID
run: |
echo "UID=$(id -u)" >> $GITHUB_ENV
echo "GID=$(id -g)" >> $GITHUB_ENV
echo "USERNAME=user" >> $GITHUB_ENV
echo "GROUPNAME=user" >> $GITHUB_ENV
# キャッシュの利用にbuildxが必要なため実行
- name: activate builx
uses: docker/setup-buildx-action@v3
# build-push-actionでGitHubActions上でキャッシュを使えるようにする
- name: setting build-push-action
uses: docker/build-push-action@v6
with:
load: true
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
UID=${{ env.UID }}
GID=${{ env.GID }}
USERNAME=${{ env.USERNAME }}
GROUPNAME=${{ env.GROUPNAME }}
- name: Docker-compose build & run
# docker composeを使用時、キャッシュ利用するため--build-argでもう一度値を渡す
run: |
docker compose build --build-arg UID=${{ env.UID }} --build-arg GID=${{ env.GID }} --build-arg USERNAME=${{ env.USERNAME }} --build-arg GROUPNAME=${{ env.GROUPNAME }}
docker compose up -d
version: '3'
services:
web:
restart: always
build:
context: .
container_name: family-finance
tty: true
stdin_open: true
working_dir: '/workspace/'
volumes:
- .bashrc:/home/user/.bashrc:ro
- .:/workspace
env_file:
- .env
FROM python:3.11
RUN apt-get update && \
apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG=ja_JP.UTF-8
ENV LANGUAGE=ja_JP:ja
ENV LC_ALL=ja_JP.UTF-8
ENV TZ=JST-9
ENV TERM=xterm
RUN apt-get install -y vim \
gcc \
less \
poppler-utils \
poppler-data \
oathtool
WORKDIR /workspace/
COPY requirements.txt .
COPY set-up-chdriver.sh .
RUN pip install --upgrade pip setuptools
RUN pip install -r ./requirements.txt
RUN chmod +x ./set-up-chdriver.sh
RUN sh ./set-up-chdriver.sh
ARG UID
ARG GID
ARG USERNAME
ARG GROUPNAME
RUN groupadd -f -g ${GID} ${GROUPNAME} && \
useradd -m -s /bin/bash -u ${UID} -g ${GID} ${USERNAME}
USER ${USERNAME}
実行結果
どうすればキャッシュ利用
Docker Buildxを使います。Buildxとは、Dockerコマンドを拡張したもので単体のDockerよりも柔軟で高機能なものになります。その機能の中にキャッシュの管理があるので、Buildxからイメージを作成、キャッシュし、docker composeで使用するという流れにしました。
GitHub Actions上でdocker/setup-buildx-action@v3
とdocker/build-push-action@v6
という外部アクションを使用すればOKです。
docker/build-push-action@v6のオプション
※List
型は改行区切りの文字列
オプション名 | 型 | 詳細 |
---|---|---|
load | bool | buildxでのレイヤーをdockerへ公開するかどうか設定する。 |
cache-from | List | ビルドに指定した外部キャッシュソースを使用する。type=gha としてGitHubリポジトリをソースに設定する。 |
cache-to | List | ビルドキャッシュを指定した外部キャッシュ先にエクスポートする。type=gha として外部キャッシュ先をGitHubリポジトリとする。mode=max はビルドイメージの全レイヤーをキャッシュし、mode=min の場合は最終ビルドステージにあるレイヤーのみエクスポートする。 |
build-args | List | ビルドプロセスに値を渡す。DockerfileにARG を設定しておき渡せるようにしておく。 |
ちなみに
なぜDockerfileでARG
を使ったのか
rootユーザーを避けて一般ユーザーでの実行をするのに、実行環境でのユーザーIDとグループIDで設定するようARG
を使いました。固定値でも良かったのですが、練習も兼ねて実行環境ごとに受け渡す形としています。
ARG
に値を渡すために環境変数を利用する
GitHubActions内での環境変数の利用は、step内で$GITHUB_ENV
に流し込むと後続step内で使うことができます。
- name: create UID & GID
run: |
echo "UID=$(id -u)" >> $GITHUB_ENV
echo "GID=$(id -g)" >> $GITHUB_ENV
echo "USERNAME=user" >> $GITHUB_ENV
echo "GROUPNAME=user" >> $GITHUB_ENV
- name: setting build-push-action
uses: docker/build-push-action@v6
with:
load: true
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
UID=${{ env.UID }}
GID=${{ env.GID }}
USERNAME=${{ env.USERNAME }}
GROUPNAME=${{ env.GROUPNAME }}
参考