Skip to content

GitHub Action で GitHub へ Push したらイメージをビルドして DockerHub へ登録する

DockerHub の Automated Build が有償化され、無償ユーザでは利用出来なくなってしまいました。 そこで GitHub に Push されたら GitHub Action でコンテナイメージをビルドし、DockerHub に登録する手順をメモしておきます。

前提

GitHub のデフォルト・ブランチ名は main へ変更してあります。 また、今回の例では GitHub と DockerHub で以下のリポジトリ名を利用するものとします。

Service Repository
GitHub hello-world-docker
DockerHub hello-world

DockerHub

Step.1

まず、DockerHub 側でリポジトリを作成します。 Create Repository をクリックします。

file

Step.2

リポジトリ名を入力したら Create をクリックし、リポジトリを作成します。

file

Step.3

Account Settings をクリックします。

file

Step.4

GitHub Action から DockerHub へアクセスする為の Access Token を作成します。 Security メニューにある New Access Token をクリックします。

file

Step.5

Access Token Description には識別しやすい名前を入力しておきます。 今回はシンプルに GitHub としました。 Generate をクリックします。

file

Step.6

Access Token が生成されます。 これは後の手順で GitHub に登録しますので控えておきます。 Copy and Close をクリックします。

file

GitHub

Step.7

DockerHub と対になる (Dockerfile を登録する) リポジトリを GitHub に作成します。 GitHub へアクセスし、RepoisitoriesCreate をクリックします。

file

Step.8

リポジトリ名を入力したら Create repository をクリックします。

file

Step.9

リポジトリが作成されました。 作成されたリポジトリが選択されたままの状態で Settings をクリックします。

file

Step.10

Secrets をクリックします。

file

Step.11

New repository secret をクリックします。

file

Step.12

DockerHub 側のユーザ名と、作成した AcceeToken を下記として登録します。

  • DOCKER_USERNAME
  • DOCKER_PASSWORD

まず、Name には DOCKER_USERNAME を、Value には DockerHub 側のユーザ名を入力します。 入力が完了したら Add secret をクリックします。

file

Step.13

同様に、次は NameDOCKER_PASSWORD を、Value には DockerHub 上で生成した Access Token を入力します。 入力が完了したら Add secret をクリックします。

file

Step.14

DOCKER_USERNAMEDOCKER_PASSWORD が登録されました。

file

ローカル PC

Step.15

ここからローカル PC で作業します。 GitHub 上に作成したリポジトリをクローンします。

1
2
git clone git@github.com:sig9org/hello-world-docker.git
cd hello-world-docker/

次に GitHub Action を保存するディレクトリ (.github/workflows/) を作成します。

1
mkdir -p .github/workflows/

GitHub Action を定義した YAML ファイルを保存します。

 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
cat << 'EOF' > .github/workflows/build.yml
name: Push to Docker registry

on:
  push:
    branches:
      - main

jobs:
  push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Login to Docker Hub
        uses: actions-hub/docker/login@master
        env:
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
          DOCKER_REGISTRY_URL: docker.io

      - name: Build :latest
        if: success()
        run: docker build -t sig9/hello-world:latest .

      - name: Deploy :latest
        if: success()
        uses: actions-hub/docker@master
        with:
          args: push sig9/hello-world:latest
EOF

Docker イメージをビルドする為の Dockerfile を登録します。 今回は Alpine をベースに Hello, World! を返すだけ、という内容です。

1
2
3
4
cat << EOF > Dockerfile
FROM alpine:latest
CMD echo "Helo, World!"
EOF

ファイルを登録し、コミットしたらリポジトリに push します。

1
2
3
git add .github/ Dockerfile
git commit -m 'My first commit.'
git push origin main

GitHub

Step.16

push されたファイルが GitHub 上に登録されていることを確認します。

file

Step.17

リポジトリの Actions を確認すると .github/workflows/ に登録されたファイル (今回は build.yml) が GitHub Action として登録され、実行中であることが分かります。

file

Step.18

しばらくすると (Dockerfile のビルドが終わり) GitHub Action が完了します。 もしエラーが出ている場合はエラー内容を確認し、デバッグします。

file

DockerHub

Step.19

DockerHub の該当リポジトリを確認すると GitHub Action によってビルドされた Docker イメージが latest タグで登録されていることが分かります。

file

ローカル PC

Step.20

ビルドしたイメージを実行してみます。

1
2
3
4
5
6
7
# docker run sig9/hello-world:latest
Unable to find image 'sig9/hello-world:latest' locally
latest: Pulling from sig9/hello-world
97518928ae5f: Pull complete
Digest: sha256:f48e960e67ad17315d7de28133975964cdb442447e02dc4a9cc80e633696f3c0
Status: Downloaded newer image for sig9/hello-world:latest
Helo, World!