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 をクリックします。

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

Step.3¶
Account Settings をクリックします。

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

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

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

GitHub¶
Step.7¶
DockerHub と対になる (Dockerfile を登録する) リポジトリを GitHub に作成します。 GitHub へアクセスし、Repoisitories → Create をクリックします。

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

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

Step.10¶
Secrets をクリックします。

Step.11¶
New repository secret をクリックします。

Step.12¶
DockerHub 側のユーザ名と、作成した AcceeToken を下記として登録します。
- DOCKER_USERNAME
- DOCKER_PASSWORD
まず、Name には DOCKER_USERNAME を、Value には DockerHub 側のユーザ名を入力します。 入力が完了したら Add secret をクリックします。

Step.13¶
同様に、次は Name へ DOCKER_PASSWORD を、Value には DockerHub 上で生成した Access Token を入力します。 入力が完了したら Add secret をクリックします。

Step.14¶
DOCKER_USERNAME と DOCKER_PASSWORD が登録されました。

ローカル PC¶
Step.15¶
ここからローカル PC で作業します。 GitHub 上に作成したリポジトリをクローンします。
次に GitHub Action を保存するディレクトリ (.github/workflows/) を作成します。
GitHub Action を定義した YAML ファイルを保存します。
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! を返すだけ、という内容です。
ファイルを登録し、コミットしたらリポジトリに push します。
GitHub¶
Step.16¶
push されたファイルが GitHub 上に登録されていることを確認します。

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

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

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

ローカル PC¶
Step.20¶
ビルドしたイメージを実行してみます。
# 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!