背景
割と最近 Docker を触るようになってきました。自作した Web アプリのデプロイ用 Dockerfile
を作ったりなんかして。
で、「Dockerfile
がちゃんとビルドできるか常に確かめる Actions Workflow も多分作れるよな?」と思ったのです。
ということで、(n番煎じかも分からん) 記事表題の通り。(※ 本記事では docker push はやりません)
GitHub Actions と Docker (cli) の基礎が分かっていれば、やることはとっても簡単。動作チェックされたサンプルコードとして見てもらえればと思います。
実装 (普通のビルド)
適当に GitHub リポジトリを作り、リポジトリルート直下に適当な Dockerfile
を作ります。別の記事で作った、ubuntu に git 入れるだけのやつでやってみます。
FROM ubuntu:latest
RUN apt update
RUN apt install -y git
そして workflow 作成。Docker のセットアップは docker/setup-buildx-action@v3
を呼ぶだけで OK。
name: Docker build test
on: push
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Source checkout
uses: actions/checkout@v4
- name: Set up docker buildx
uses: docker/setup-buildx-action@v3
- name: Build docker image
run: docker build -t built-image .
push して結果確認。
ビルドのログを確認できました。
イメージファイルを出力してみる
もうちょっと応用を効かせて、作ったイメージを Artifact として出力させてみます。
Docker のコマンドでイメージを tar に出力した後、actions/upload-artifact
で出力します。
name: Docker build test
on: push
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Source checkout
uses: actions/checkout@v4
- name: Set up docker buildx
uses: docker/setup-buildx-action@v3
- name: Build docker image
run: docker build -t built-image .
+ - name: Export docker image
+ run: docker save -o built-image.tar built-image
+ - name: Save image as artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: built-image.tar
+ path: built-image.tar
push して確認。
無事イメージが出力されました。
実装 (もっとリッチなビルド)
(2024/11/22 追記)
自分で Artifact 出力とかしていましたが、もっと良いのが用意されているではありませんか。
name: Docker build test
on: push
jobs:
docker-build:
runs-on: ubuntu-latest
steps:
- name: Source checkout
uses: actions/checkout@v4
- name: Set up docker buildx
uses: docker/setup-buildx-action@v3
- name: Build docker image
- run: docker build -t built-image .
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ push: false
+ cache-from: type=gha
+ cache-to: type=gha
(ここからビルド内容は、Git インストールじゃなくてまた別記事で作ったビルドになります。ビルド時間の差が分かりやすいし。)
push して結果を見てみると?
ビルド結果が出力されているではありませんか。それに、いい感じにキャッシュしてくれる機能もあるようです。早速 Re-run all jobs してみると?
ビルド時間が 36秒からたったの 3秒に!(まぁ変更無しだからそりゃ早いけど・・・)
勝手に「push は用無いし」と思ってたら、push しなくても色々ありました。他にも色々オプションがあるようで、Customizing を参照。
おわり
これで、Dockerfile
が壊れていないか自動テストすることができます。
それだけでなく、 Docker 公式で色々 Actions を用意してくれているようなので、探ってみると色々便利なものが見つかるかも。docker push
も活用すれば自動でイメージをアップデートすることもできるようです。