Docker Build Cloudを試す

Docker Build Cloudがリリースされたので、試しにかねてよりアウトソースしたいと思っていたEPGStation on RaspberryPi用のイメージビルドを実装してみます。

対象

ビルドしたいDockerfileはここにあります。 ラズパイ上で動かすイメージのため、アーキテクチャはArm/v7向けのみビルドします。

全体的な構成

登場人物と全体的な流れは以下の通りになります。

  1. GitHubへのプッシュをトリガーにWodkflowを実行
  2. Workflow内で以下の処理を実行
    1. DockerHubへログイン
    2. Docker Build Cloudへビルド要求をリクエスト
  3. Docker Build Cloud(Builder)上でイメージがビルドされる
  4. イメージをBuilderからDocker Hubへ直接アップロード

なお Arm/v7 でのビルドはDocker Build Cloud(buildx)で実現するためGitHub Actionsは通常通り amd64 でOKです。

設定

Docker Build Cloud

  1. Docker Build Cloudへログインします
  2. プランを選択します
    今回はお試しということで無償プランの「Starter」を選択します
  3. Builderを作成します
    Builderとは、イメージをビルドするためのインスタンスで、実体はBuildKitというデーモンです。
    BuilderはBuild Cloud以前からある概念のようで、元来は自分たちで用意するものだったようです。
    つまりDocker Build CloudはBuilderが提供されるクラウドサービスということができそうです。

GitHub(リポジトリ)

  • リポジトリシークレットを作成します
    1. リポジトリのSettings > Secrets and variables > Actions
    2. 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を調整してもう少し時間短縮をしてみようと思います。

参照

Docker Build Cloud | Docker Docs

Docker Buildx | Docker ドキュメント

関連記事

comments powered by Disqus