仕事で使うDockerイメージも(別にばれても困らないものに限ってですよ)Docker Hubに置いていたのですが、先日仕事で使おうとしたら、一度に多量のアクセスがあったためにRate Limitにかかるという障害(Docker側が悪いわけじゃないぞ)が起きてました。 ということで、かねてからの懸案であったGHCR(GitHub Container Registry)の利用を検討してみたところ、資料が増えていたからか案外サクッとできたので記録。

さっそくですがワークフロー定義としてはこんな感じになりました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: イメージ作成とpush(to GHCR)

on:
  push:
    branches:
      - 'main'
  workflow_dispatch:

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  docker:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
    # (1)
    - name: Log in to the Container registry
      uses: docker/login-action@v3
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}
    # (2)
    - name: Extract metadata (tags, labels) for Docker
      id: meta
      uses: docker/metadata-action@v4
      with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          # latestタグも追加
          flavor: |
            latest=${{ github.ref == 'refs/heads/main' }}            
    # (3)
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    # (4)
    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        file: image/Dockerfile
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        platforms: linux/amd64,linux/arm64

大きな処理の分割としては、4カ所ポイントっぽいのがあるので説明をば。

(1) Docker HubではなくGHCRへのログイン

  • レジストリは ghcr.io となります
  • ユーザ名はActionsを実行してるアカウント、パスワードはGitHub側での自動生成トークンを使っています

(2) メタデータのロードとセット

  • Actionsで生成されるイメージのタグは、ブランチ名(この場合main)のみになり、latestタグがつきません
  • ということで、mainブランチをビルドした際はlatestタグも付与されるようにセットしてます

(3) Buildxの準備

  • amd64(x86_64)だけでなくarm64(aarch)を設定したいため、Buildxの仕込みをさせてます
  • これをしてないとデフォルトのアーキテクチャのみです

(4) ビルド作業・プッシュ

  • platforms指定で両アーキテクチャを仕込ませます

現状の悩み

アーキテクチャ種別として linux/amd64およびlinux/arm64が出るのは想定ですが、 unknown/unknown なるものが出て謎です。 これどうやったら消せるんだろう。