Docker Build Cloudを試す
Docker Build Cloudがリリースされたので、試しにかねてよりアウトソースしたいと思っていたEPGStation on RaspberryPi用のイメージビルドを実装してみます。
対象
ビルドしたいDockerfileはここにあります。
ラズパイ上で動かすイメージのため、アーキテクチャはArm/v7
向けのみビルドします。
全体的な構成
登場人物と全体的な流れは以下の通りになります。
- GitHubへのプッシュをトリガーにWodkflowを実行
- Workflow内で以下の処理を実行
- DockerHubへログイン
- Docker Build Cloudへビルド要求をリクエスト
- Docker Build Cloud(Builder)上でイメージがビルドされる
- イメージをBuilderからDocker Hubへ直接アップロード
なお Arm/v7
でのビルドはDocker Build Cloud(buildx)で実現するためGitHub Actionsは通常通り amd64
でOKです。
設定
Docker Build Cloud
- Docker Build Cloudへログインします
- プランを選択します
今回はお試しということで無償プランの「Starter」を選択します - Builderを作成します
Builderとは、イメージをビルドするためのインスタンスで、実体はBuildKitというデーモンです。
BuilderはBuild Cloud以前からある概念のようで、元来は自分たちで用意するものだったようです。
つまりDocker Build CloudはBuilderが提供されるクラウドサービスということができそうです。
GitHub(リポジトリ)
- リポジトリシークレットを作成します
- リポジトリのSettings > Secrets and variables > Actions
- Repository secretsから2つのシークレットを作成し、それぞれDockerHubログイン時に使う値を設定しておきます
DOCKER_USER
DOCKER_PASSWORD
ワークフローファイル
リポジトリ内にワークフローファイルを作成しGitHubへプッシュします。
文法は公式ドキュメントを参考に。
今回作成したファイルはこちら。
docker/build-push-action@v5
公式ドキュメントのサンプルでは説明が不足していますが、利用できるオプションはここから確認できます。
ターゲットのアーキテクチャは platform
オプションで指定できます。利用可能な値はここから確認できます。
- name: Build and push
uses: docker/build-push-action@v5
with:
context: "./epgstation"
file: "./epgstation/debian.Dockerfile"
tags: "uyorum/rpi-mirakurun-epgstation"
platforms: linux/arm/v7
# For pull requests, export results to the build cache.
# Otherwise, push to a registry.
outputs: ${{ github.event_name == 'pull_request' && 'type=cacheonly' || 'type=registry,push=true' }}
ここまで正しく設定できていればワークフローが自動で始まりDockerHubへイメージがプッシュされるはずです。
Docker Build Cloudを使うメリット
Buildxを使うことによるメリットと、さらにBuilderがクラウドで提供されることによるメリットがあります。
前者は主に「開発中とCIの両方でビルド環境を共有できること」にあると思います。今回は触れませんでしたが、うまく設定することでキャッシュの共有などを行い、チーム全体の作業時間を短縮することができそうです。
後者は言わずもがな、Builderの管理負荷の軽減でしょう。
なお、実は今回対象にしたイメージはビルド中にffmpegのコンパイルも行っています。これまではラズパイ上でこのコンパイルを行っていたためイメージのビルドに40分以上かかっていました。今回Docker Build Cloudをつかうことでここの高速化も密かに期待していましたが、結果的に30分以上かかっているため、単純なCPU性能はそこまで高くなさそうです。
ここについてはDockerfileを調整してもう少し時間短縮をしてみようと思います。
参照
関連記事
- RaspberryPi上のEPGStationコンテナ用にffmpegをビルドする(2023年9月版)
- Raspberry PiにDockerでMirakurun/EPGStationを導入する
- EPGStationでときどきエンコードに失敗する
- EPGStationの録画データをNASへ自動で同期する